एक चर से फ़ाइल नाम पर वर्तमान तिथि लागू करना


55

मैं इस तरह एक फ़ाइल नाम के अंत में वर्तमान तिथि को जोड़ने की कोशिश कर रहा हूँ:

TheFile.log.2012-02-11

यह है, जो कि अभी तक मेरे पास है:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

हालाँकि मुझे जो भी मिल रहा है वह फ़ाइल का नाम है, और यह कुछ भी नहीं जोड़ता है। मैं एक फ़ाइल नाम पर वर्तमान दिनांक कैसे जोड़ूँ?


जब आप तिथि निर्धारित करते हैं, तो सुनिश्चित करें कि इसका उपयोग न करें :क्योंकि तब इसे rsync और scp में होस्ट के रूप में पढ़ा जाएगा। stackoverflow.com/a/37143274/390066
kirill_igum

जवाबों:


78

अधिक से अधिक यह आपके उपयोग की संभावना है set। यह 'आज', '=' और dateप्रोग्राम के आउटपुट को मुख्य मापदंडों (उर्फ कमांड-लाइन आर्ग्युमेंट्स) में असाइन करेगा । आप केवल सी शेल का उपयोग करना चाहते हैं (जिसे आप "बैश" के रूप में टैग कर रहे हैं, इसलिए संभावना नहीं है), आप उपयोग करना चाहेंगे:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

बराबर चिह्न के आसपास रिक्त स्थान की कमी को नोटिस करें।

आप &अपने बयानों के अंत में भी उपयोग नहीं करना चाहते हैं ; जिसके कारण शेल समाप्त होने की प्रतीक्षा नहीं करता है। खासकर जब कोई अगले पर भरोसा करता है। findआदेश विफल हो सकता है, क्योंकि यह पहले शुरू किया गया है mkdir


उस दोस्त के लिए धन्यवाद, उसके कामकाजी% 100 ठीक अब, चीयर्स फॉर द हेड-अप एंड एमकेडिर
I AM L

55

किसी फ़ाइल नाम में दिनांक को इंजेक्ट करने के लिए बैश स्क्रिप्ट:

फ़ाइल में यह बैश कोड a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

जब चलाने, प्रिंट:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

कोड की व्याख्या:

/ बिन / बैश दुभाषिया के साथ स्क्रिप्ट की व्याख्या करें। आज एक नया चर बनाएं। आउटपुट को कॉन्फ़िगर करने के लिए Y, m, d, H, M, S फ्लैग में पास होने वाले डेट कमांड को निष्पादित करें। परिणाम को दिनांक चर में रखें।

फ़ाइल नाम से एक नया चर बनाएँ, शेष स्थिर फ़ाइल नाम के साथ $ आज चर को घेरें। फिर फ़ाइल नाम को स्क्रीन पर गूँजें।

लल्ज़ बढ़ाने के लिए इसे वन-लाइनर में बदलें:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

आपको कई चीजें मिली हुई लगती हैं।

set today = 'date +%Y'tcsh सिंटैक्स की तरह दिखता है, लेकिन tcsh में भी यह date +%Yवैरिएबल को स्ट्रिंग असाइन करता है today, यह dateकमांड को रन नहीं करता है । जैसा कि आप शायद bash या कुछ अन्य POSIX शेल का उपयोग कर रहे हैं, असाइनमेंट का सिंटैक्स है today=some_value(समान चिह्न के आसपास कोई स्थान नहीं है)। कमांड चलाने और इसके आउटपुट को वेरिएबल में असाइन करने के लिए, कमांड प्रतिस्थापन का उपयोग करें :

today=$(date +%Y-%m-%d)

(मैंने तारीख विनिर्देश भी पूरा कर लिया है)। आप डॉलर-कोष्ठक के बजाय बैकक्वाट्स का उपयोग कर सकते हैं, लेकिन यह आगे के उद्धरणों के साथ नेत्रहीन रूप से भ्रमित होने का खतरा है, और जब आपको बैकक्ओटेड कमांड के अंदर उद्धरण चिह्नों की आवश्यकता होती है तो नियम बहुत जटिल और कार्यान्वयन-निर्भर होते हैं, इसलिए इसे छड़ी न करना बेहतर है $(…)(जो एक सायरन सिंटैक्स के साथ एक ही प्रभाव है)।

आपने &कई आदेशों के अंत में उपयोग किया । यह पृष्ठभूमि में कमांड निष्पादित करता है, जो यहां नहीं चाहता है। मुझे संदेह है कि आप का मतलब है &&, जिसका मतलब है कि अगली कमांड निष्पादित करने के लिए केवल अगर पहली कमांड सफल हुई।

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

&&प्रत्येक कमांड के बाद उपयोग करने का एक विकल्प आपकी स्क्रिप्ट को शुरू करना है set -e। यह शेल को स्क्रिप्ट को निष्पादित करने से रोकने के लिए कहता है जैसे ही कोई भी कमांड एक गैर-स्थिति ( ifकुछ स्थितियों और कुछ मामलों में आदेशों को छोड़कर ) को वापस कर देता है।

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

आपकी findआज्ञा ठीक है लेकिन संभवत: वह नहीं है जो आप करने का इरादा रखते हैं (हालांकि मुझे नहीं पता कि वह क्या है)।

आप के साथ एक निर्देशिका बना रहे हैं mkdirऔर फिर तुरंत इसके साथ चल रहे हैं find। यह तब तक उपयोगी नहीं होगा जब तक कि निर्देशिका पहले से मौजूद न हो। क्या आप आज के लॉग के लिए एक निर्देशिका बनाने और हाल की फाइलों The_Logsको एक निर्देशिका से स्थानांतरित करने का मतलब है The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

या क्या आपके पास प्रत्यय जोड़ने के लिए आज की लॉग फ़ाइलों का नाम बदलने का मतलब है $today? प्रत्येक फ़ाइल को स्थानांतरित करने के लिए अलग फ़ाइल नाम की गणना करने की आवश्यकता होती है।

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

ध्यान दें कि मैंने उपयोग किया है -mtime, उनके संशोधन समय के आधार पर फ़ाइलों को स्थानांतरित करने के लिए, और नहीं -atime, वह समय है जब फ़ाइल को अंतिम बार पढ़ा गया था (यदि आपका सिस्टम उस पर नज़र रखता है - यदि ऐसा नहीं होता है, तो समय के साथ वापस आ सकता है mtime)।



2

इस:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

कार्य करना चाहिए। हालाँकि, ऐसा लगता है कि आप csh का उपयोग कर रहे हैं और + चिन्ह को हटाने का मेरा समाधान आपके लिए काम नहीं कर सकता है, लेकिन यह कोशिश करने के लिए चोट नहीं पहुँचाएगा। {} घुंघराले कोष्ठक में अपने चर को शामिल करते हुए, अप्रत्याशित चर विस्तार को रोकने के लिए हमेशा एक अच्छा विचार है।


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