एक फ़ाइल की प्रतिलिपि बनाएँ और एक टाइमस्टैम्प संलग्न करें


13

मुझे अपनी स्क्रिप्ट के साथ दो मुद्दे मिले हैं जो फ़ाइलों की प्रतिलिपि बनाता है और नाम के लिए टाइमस्टैम्प जोड़ता है।

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

उपरोक्त Test2फ़ाइल नाम के रूप में जोड़ता है , लेकिन मैं इसे मूल स्रोत फ़ाइल का फ़ाइल नाम रखना चाहता हूं जो इस उदाहरण में नामित है Test

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

दूसरा मुद्दा यह है कि जब मैं %rटाइमस्टैम्प कोड के रूप में जोड़ता हूं तो मुझे त्रुटि मिलती है कि लक्ष्य "पीएम" एक निर्देशिका नहीं है। मैं 12 घंटे की घड़ी के समय के रूप में टाइमस्टैम्प प्राप्त करने की कोशिश कर रहा हूं।


AM / PM को जोड़ने से फ़ाइल नाम में अतिरिक्त स्थान जुड़ जाता है। यदि आप इसे कुछ इस तरह आजमाने की जिद करते हैं: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (तारीख +% m-% d-% y-% r)"
रोमियो निनोव

2
याdate +"%m-%d-%y-%I:%M:%S_%p"
डॉन_क्रांति

जवाबों:


12

आपकी समस्याओं में से एक यह है कि आपने कमांड प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों को छोड़ दिया है, इसलिए dateकमांड से आउटपुट रिक्त स्थान पर विभाजित किया गया था। देखें कि मेरा शेल स्क्रिप्ट व्हॉट्सएप या अन्य विशेष पात्रों पर क्यों चोक करता है? यह एक मान्य आदेश है:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

यदि आप मूल फ़ाइल नाम को जोड़ना चाहते हैं, तो आपको एक चर में होना चाहिए।

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

यदि आप बैश का उपयोग कर रहे हैं, तो आप इसके बजाय ब्रेस विस्तार का उपयोग कर सकते हैं।

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

यदि आप फ़ाइल को किसी भिन्न निर्देशिका में कॉपी करना चाहते हैं, और टाइमस्टैम्प को मूल फ़ाइल नाम में संलग्न करना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं - अंतिम भाग तक बिना भाग के मान तक ${source##*/} फैलता है (यह पैटर्न से मेल खाते सबसे लंबे उपसर्ग को हटा देता है। ):source/*/

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

यदि Test1एक निर्देशिका है, तो इसे पुनरावर्ती रूप से कॉपी किया जाता है, और निर्देशिका के अंदर की फाइलें अपना नाम रखती हैं: केवल टॉपलेवल निर्देशिका को टाइमस्टैम्प जोड़ा जाता है (जैसे Test1/fooकॉपी किया जाता है Test1-05-10-15-07:19:42 PM)। यदि आप सभी फ़ाइल नामों के लिए टाइमस्टैम्प को जोड़ना चाहते हैं, तो यह एक अलग समस्या है।

टाइमस्टैम्प प्रारूप की आपकी पसंद एक बुरा विचार है: मनुष्यों के लिए पढ़ना कठिन है और कठिन है। आपको एक ऐसे प्रारूप का उपयोग करना चाहिए जो पढ़ने में आसान हो और जिसे आसानी से क्रमबद्ध किया जा सके, अर्थात महत्व के घटते क्रम में भागों के साथ: वर्ष, महीना, दिन, घंटा, मिनट, दूसरा, और दिनांक भाग और समय भाग के बीच अलगाव के साथ।

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"

गिल्स, पहला कमांड IMHO काम नहीं करेगा, दोहरे उद्धरण चिह्नों की जाँच करें। और सवाल के लिए मेरी टिप्पणी देखें
रोमियो निनोव

@ RomeoNinov पहले कमांड में क्या गलत है? क्या आपने इसे चलाया और कोई त्रुटि मिली?
गिल्स एसओ- बुराई को रोकना '10

आप सही हैं, दिनांक कमांड को उपधारा में निष्पादित किया जाता है
रोमियो निनोव

गिल्स, आपके उपरोक्त उदाहरण का उपयोग करते हुए, मैं फ़ाइल को किसी अन्य निर्देशिका में उपरोक्त टाइमस्टैम्प जानकारी के साथ कैसे कॉपी करूंगा। निम्न आदेश काम नहीं करता है:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
ब्रायन

@Brian मुझे यकीन नहीं है कि मैं आपकी टिप्पणी को समझ गया हूं, लेकिन मेरा संपादन देखें।
गिल्स एसओ- बुराई को रोकना '10
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.