आपकी समस्याओं में से एक यह है कि आपने कमांड प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों को छोड़ दिया है, इसलिए 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")"