बैकअप फ़ाइल के लिए दिनांक कैसे जोड़ें


69

मुझे एक फ़ाइल का बैकअप बनाने की आवश्यकता है, और मैं अंतर करने के लिए आसान बनाने के लिए नाम के भाग के रूप में टाइमस्टैम्प रखना चाहूंगा।

आप वर्तमान तिथि को कॉपी कमांड में कैसे इंजेक्ट करेंगे?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

जवाबों:


108

यह काम नहीं कर रहा है क्योंकि कमांड dateइसमें रिक्त स्थान के साथ एक स्ट्रिंग देता है।

$ date
Wed Oct 16 19:20:51 EDT 2013

यदि आप वास्तव में फ़ाइल नाम चाहते हैं तो आपको उस स्ट्रिंग को उद्धरण चिह्नों में लपेटना होगा।

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

आप शायद एक अलग स्ट्रिंग के बारे में सोच रहे हैं जिसे जोड़ा जाना मेरा अनुमान होगा। मैं आमतौर पर कुछ इस तरह का उपयोग करता हूं:

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

दिनांक और समय के लिए आउटपुट के चारों ओर अधिक स्वरूपण कोड के लिए दिनांक के लिए मैन पेज देखें ।

अतिरिक्त प्रारूप

यदि आप पूर्ण नियंत्रण रखना चाहते हैं यदि आप उस आदमी पृष्ठ से परामर्श करें जो आप इस तरह से कर सकते हैं:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

+1 - मैं हमेशा दिनांक के लिए एक प्रारूप निर्दिष्टक का उपयोग करता हूं, या तो "% Y% m% d-% H% M% S" या "% y% m% d-% H% M% S"।
१२:१२ पर

बस touch foo`date +%F`भी ठीक काम करता है।
वडज़िम

कैविएट: यह cshशेल में काम नहीं करता है
गोविंदा सखारे

1
@ गोविंदासखरे - csh / tshsh ने उपधारा संकेतन को backticks ( ...) के बजाय स्विच किया $(..)। सी गोले स्पष्ट रूप से उपधाराओं के लिए उस संकेतन का समर्थन नहीं करते हैं।
SLM

13
cp foo.txt {,.backup.`date`}

यह कुछ इस तरह फैलता है cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013। ब्रेसिज़ से पहले की जगह एक नया शब्द शुरू होता है।

cp foo.txt {,.backup. $((date)) }

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

cp foo.txt foo.backup.`date`

करीब। आप इसे ब्रेसिज़ के साथ व्यक्त कर सकते थे cp foo.{txt,.backup.`date`}। अभी भी समस्या है कि आउटपुट dateमें रिक्त स्थान हैं, इसलिए इसे दोहरे उद्धरण चिह्नों के अंदर रखना होगा। यह काम करेगा:

cp foo.{txt,backup."`date`"}

या

cp foo.{txt,backup."$(date)"}

डिफ़ॉल्ट आउटपुट स्वरूप dateएक फ़ाइल नाम के लिए अच्छी तरह से अनुकूल नहीं है, और यह भी काम नहीं कर सकता है यदि कोई /डिफ़ॉल्ट डिफ़ॉल्ट आउटपुट स्वरूप में वर्णों का उपयोग करता है । YMD दिनांक स्वरूप का उपयोग करें ताकि फ़ाइल नामों पर लेक्सोग्राफ़िक क्रम कालानुक्रमिक क्रम हो (और साथ ही अमेरिका और अंतर्राष्ट्रीय दिनांक स्वरूपों के बीच अस्पष्टता से बचने के लिए)।

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

पिछले एक ने मुझे cp दिया: लक्ष्य `foo..backup.20160913-134158 'एक निर्देशिका नहीं है
कल्पेश सोनी

@KalpeshSoni मैंने जो सटीक कमांड पोस्ट की है वह इस त्रुटि संदेश का उत्पादन नहीं कर सकती है। आपने एक अलग कमांड का उपयोग किया होगा।
गाइल्स

10

यदि आप वास्तव में वर्बोज़ तिथि का उपयोग करना चाहते हैं, तो आपको बैकटिक की सुरक्षा करनी चाहिए। इस दिनांक प्रारूप के साथ यह है कि इसमें अंतःस्थापित स्थान हैं, जब तक आप उन्हें उद्धरणों के अंदर नहीं डालते (या किसी अन्य तरीके से उनसे बचते हैं) में एक नहीं-नहीं।

cp foo.txt "foo-`date`.txt"

हालांकि, मैं छोटे आईएसओ प्रारूप का उपयोग करना पसंद करता हूं:

cp foo.txt foo-`date --iso`.txt

5

एक फ़ंक्शन का उपयोग करें, यह आपके जीवन को आसान बना देगा। यही है वह जो मेरे द्वारा उपयोग किया जाता है:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

4

जैसा कि dateइसके आउटपुट में डिफ़ॉल्ट व्हाट्सएप द्वारा किया गया है, आपकी अंतिम कमांड विफल हो गई है। यदि आपने अंतिम तर्क के साथ अंदर उद्धृत किया था ", तो यह काम करना चाहिए। आपके अन्य प्रयासों में सिर्फ गलत सिंटैक्स है

यहां व्हाट्सएप के बिना संभव समाधान:

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

या

cp foo.txt foo.backup.`date --iso-8601=seconds`

अगर आप जोड़ते हैं

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

अपने .bashrcऔर फिर से लॉगिन करने के लिए / अपने बैश को फिर से शुरू करने दें, आपको बस कॉल करने की आवश्यकता है bk file.txt


मेरा आरएचईएल तारीख मैनुअल --iso-8601स्विच नहीं दिखाता है , इसलिए मैंने यहां लिंक डाला। जीएनयू तिथि विकल्प: --iso-8601
इवान चाऊ

3

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

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

या:

आप "कैट" का उपयोग करके फ़ाइल की सामग्री को प्रदर्शित कर सकते हैं और आउटपुट को बैकअप फ़ाइल पर पुनर्निर्देशित कर सकते हैं जिसका नाम एपेंडेड टाइम स्टैम्प के साथ बनाया गया है

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

आप अपनी आवश्यकता के अनुसार अधिक FORMAT नियंत्रण विकल्पों का भी उपयोग कर सकते हैं जैसे:% H,% M,% S, आदि।


catपुनर्निर्देशन के साथ लाभ क्या है cp?
गुइडो

ऐसा करने के लिए यह केवल वैकल्पिक तरीका है
अतुल रोकडे

1

बैश में आप टाइप कर सकते हैं:

cp /path/to/long/filename !#$_$(date +Is)

जिसका विस्तार है:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

जिसके परिणामस्वरूप:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

गोमांस होना date -Is। मुझे इसका उपयोग करना पसंद है क्योंकि यह याद रखना आसान है, टाइप करें, और छोटे संस्करणों की अनुमति देता है (जैसे -Inकि आप सटीक सनकी हैं)।


! एक ईवेंट डिज़ाइनर शुरू करता है:

 !#     The entire command line typed so far.

और $एक शब्द डिज़ाइनर है:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

1

जब मुझे किसी फ़ाइल का बैकअप बनाना होता है तो मैं आमतौर पर इसे इस तरह से करता हूं।

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
यह कुछ भी नहीं जोड़ता है कि अन्य उत्तर पहले से ही नहीं लाए गए हैं। इसके अतिरिक्त, %Fदिनांक प्रारूप 2-अंकीय महीनों का उत्पादन करता है, और ls -lआमतौर पर केवल फ़ाइल नाम की तुलना में थोड़ा अधिक जानकारी देता है।
Kusalananda

0

यदि आप केवल फ़ाइल या निर्देशिका का बैकअप चाहते हैं, तो गंतव्य को भी क्यों लिखें, प्रतिलिपि फ़ाइल नाम के अंत में दिनांक जोड़ने के लिए शेल विस्तार का उपयोग करें।

अर्थात

cp filename.sh{,."`date`"}

जिसके परिणामस्वरूप

filename.sh.Sun 29 Sep 00:44:43 BST 2019

या बस का उपयोग करें

cp filename{,.20190929}

filename.sh.20190929

अपनी आवश्यकताओं के अनुरूप तारीख डालें। :)

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