BASH में mv के साथ एक फ़ाइल नाम के लिए टाइमस्टैम्प जोड़ना


85

खैर, मैं एक लिनक्स नौसिखिया हूं, और मैं एक साधारण बैश स्क्रिप्ट के साथ एक मुद्दा बना रहा हूं।

मुझे एक प्रोग्राम मिला है जो लॉग फ़ाइल में चल रहा है जबकि यह चल रहा है। समय के साथ लॉग फ़ाइल बहुत बड़ी हो जाती है। मैं एक स्टार्टअप स्क्रिप्ट बनाना चाहूंगा जो प्रोग्राम के प्रत्येक रन के लिए प्रभावी रूप से अलग लॉग फाइल बनाने से पहले प्रत्येक रन से पहले लॉग फाइल को फिर से नाम और स्थानांतरित करेगा। यहाँ मैंने अभी तक क्या किया है:

pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

जब मैं दौड़ता हूं, तो मैं यह देखता हूं:

: command not found
program

जब मैं लॉग निर्देशिका में सीडी और डीआईआर चलाता हूं, तो मैं यह देखता हूं:

201111211437\r.log\r

क्या चल रहा है? मैं मान रहा हूँ कि कुछ वाक्यविन्यास समस्या मुझे याद आ रही है, लेकिन मुझे यह पता नहीं लग सकता है।


अद्यतन: नीचे शेल्टर की टिप्पणी के लिए धन्यवाद, मुझे इस तथ्य के कारण समस्या का पता चला है कि मैं .sh फ़ाइल को Notepad ++ में विंडोज़ में संपादित कर रहा हूं, और फिर FTP के माध्यम से सर्वर पर भेज रहा हूं, जहां मैं फाइल को ssh के माध्यम से चलाता हूं। । फ़ाइल पर dos2unix चलाने के बाद, यह काम करता है।

नया प्रश्न: मैं पहली बार फ़ाइल को सही तरीके से सहेज सकता हूं, हर बार जब मैं फ़ाइल को फिर से भेजता हूं तो इस फिक्स को करने से बचने के लिए कैसे?


2
\ris carriage_return, अपने बैश स्क्रिप्ट की जांच करें, शायद स्क्रिप्ट के अंदर शामिल हो
ajreal

वह गाड़ी कहां से वापस आ रही होगी? मैं अनुमान लगा रहा हूं कि कुछ logs/$DATE.logगलत है, लेकिन टाइप echo logs/$DATE.logकरने से सही रास्ता निकलता है।
Cat5InTheCradle

मुझे कैसे पता चलेगा? पत्राचार बैश स्क्रिप्ट संलग्न करें, संभावना है कि ध्यान देने योग्य श्वेतपत्र नहीं है
अजूरी

मुख्य पोस्ट में एक पास्टबिन लिंक जोड़ा गया है, लेकिन यह कोड स्निपेट का शाब्दिक अर्थ है पूरी स्क्रिप्ट, मैंने एक लाइन के लिए 'इको प्रोग्राम' प्रतिस्थापित किया है जो कि एक जावा लॉन्च करता है।
kar

कोई विचार नहीं ... सही प्रतीत होता है, कैसे आप के बाद कुछ तार जोड़ने की कोशिश के बारे में DATE=$(date +"%Y%m%d%H%M")?
अजरियल

जवाबों:


24

आपकी स्क्रिप्ट से पोस्ट की गई कुछ पंक्तियाँ मुझे ठीक लगती हैं। यह शायद कुछ गहरा है।

आपको यह खोजने की आवश्यकता है कि कौन सी रेखा आपको यह त्रुटि दे रही है। set -xvअपनी स्क्रिप्ट के शीर्ष पर जोड़ें । यह लाइन नंबर और उस कमांड का प्रिंट आउट लेगा जिसे STDERR को निष्पादित किया जा रहा है । इससे आपको यह पता लगाने में मदद मिलेगी कि आपकी स्क्रिप्ट में आपको यह विशेष त्रुटि कहां मिल रही है।

BTW, क्या आपके पास आपकी स्क्रिप्ट के शीर्ष पर एक शेबंग है ? जब मुझे ऐसा कुछ दिखाई देता है, तो मैं आमतौर पर शेबंग के साथ इसके मुद्दे की उम्मीद करता हूं। उदाहरण के लिए, यदि आप #! /bin/bashशीर्ष पर थे , लेकिन आपका बैश दुभाषिया स्थित है /usr/bin/bash, तो आपको यह त्रुटि दिखाई देगी।

संपादित करें

नया प्रश्न: मैं पहली बार फ़ाइल को सही तरीके से सहेज सकता हूं, हर बार जब मैं फ़ाइल को फिर से भेजता हूं तो इस फिक्स को करने से बचने के लिए कैसे?

दो तरीके:

  1. जब आप किसी फ़ाइल को संपादित करते हैं तो संपादन-> ईओएल रूपांतरण-> यूनिक्स प्रारूप मेनू आइटम का चयन करें । एक बार इसकी सही लाइन समाप्त हो जाने के बाद, नोटपैड ++ उन्हें रखेगा।
  2. यह सुनिश्चित करने के लिए कि सभी नई फ़ाइलों में सही लाइन एंडिंग्स हैं, सेटिंग्स-> प्राथमिकताएँ मेनू आइटम पर जाएँ, और प्राथमिकताएँ संवाद बॉक्स ऊपर खींचें । का चयन करें नया दस्तावेज़ / डिफ़ॉल्ट निर्देशिका टैब। नए दस्तावेज़ और प्रारूप के तहत , यूनिक्स रेडियो बटन का चयन करें। क्लोज बटन पर क्लिक करें।

अगर मैं कोशिश कर सकता हूँ कि मैं देख रहा हूँ। Dos2unix चलाने के बाद एक बार फाइल मेरे लिनक्स सर्वर के लिए ftp'd है, लेकिन समस्या को हल करती है, लेकिन मैं इस अतिरिक्त कदम के चारों ओर एक रास्ता तलाश रहा हूं। मेरे पास शुरुआत में शेबंग नहीं है, यह कुंजी हो सकती है।
Cat5InTheCradle

2
@AgentSnazz - आह हा! यही समस्या है। यूनिक्स खोल स्क्रिप्ट में यूनिक्स लाइन अंत होना चाहिए। Windows / MS-DOS लाइन के अंत को चिह्नित करने के लिए कैरिज रिटर्न-लाइनफीड (उर्फ CRLF या \ r \ n) का उपयोग करता है। यूनिक्स सिर्फ एक लाइनफीड (उर्फ एलएफ या \ n) का उपयोग करता है। यदि आप विंडोज मशीन पर यूनिक्स के लिए एक फ़ाइल संपादित कर रहे हैं, तो आपको एक प्रोग्राम एडिटर का उपयोग करना चाहिए जो सही लाइन एंडिंग (जैसे विम या नोटपैड ++) कर सकता हैकभी नोटपैड का उपयोग न करें । इसीलिए आप \rफ़ाइल नाम में देख रहे हैं । \rआपके कार्यक्रम में प्रत्येक पंक्ति के अंत में एक अदृश्य है ।
डब्ल्यू पर डेविड डब्ल्यू

82
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

16
date +"%Y%m%d%H%M"यदि आपका बैश थोड़ा अलग है
झिझक

6
@ Zinking की बात पर जोर देने के लिए, प्लस साइन और दोहरे उद्धरण चिह्नों के बीच जगह नहीं होनी चाहिए
puk

9

बैश के भीतर एक एकल पंक्ति विधि इस तरह काम करती है।

[कुछ आउट पुट]> $ (तारीख "+% Y.% m।% d-% H.% M.% S"। क्रिया

टाइम एक्सटेंशन के साथ टाइमस्टैम्प नाम से एक फाइल बनाएंगे। एक कार्यशील फ़ाइल लिस्टिंग स्नैप शॉट को डेट स्टैम्प फ़ाइल नाम के रूप में निम्नानुसार यह काम कर सकता है।

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

बेशक

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

या सरल भी

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver


5

मैं इस कमांड का उपयोग साधारण फाइल को घुमाने के लिए करता हूँ:

mv output.log `date +%F`-output.log

स्थानीय फ़ोल्डर में मेरे पास है 2019-09-25-output.log


4

खैर, यह आपके सवाल का सीधा जवाब नहीं है, लेकिन जीएनयू / लिनक्स में एक उपकरण है जिसका काम नियमित आधार पर लॉग फ़ाइलों को घुमाने के लिए है, पुराने लोगों को एक निश्चित सीमा तक ज़िपित रखना। आईटी इसlogrotate


मैं इसे देखूंगा, मुझे अपनी विधि पसंद है क्योंकि यह प्रोग्राम के प्रत्येक रन को अच्छी तरह से अपने लॉग फ़ाइल में लपेटता है।
Cat5InTheCradle

1

आप नोटपैड में अपनी स्क्रिप्ट लिख सकते हैं, लेकिन यह सुनिश्चित करें कि आप उन्हें इस का उपयोग करके परिवर्तित करते हैं -> $ sed -i 's / \ r $ //'

मैं यह सब उस समय का उपयोग करता हूं जब मैं साइबरविन में काम कर रहा हूं और यह काम करता है। उम्मीद है की यह मदद करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.