Unix Shell scripting for copying files and creating directory -


मेरे पास एक स्रोत निर्देशिका है जैसे / my / source / directory / और एक गंतव्य निर्देशिका जैसे < / my / dest / directory / , जिसे मैं कुछ बाधाओं के साथ दर्पण करना चाहता हूं।

  • मैं उन फ़ाइलों की प्रतिलिपि बनाना चाहता हूं जो ढूंढने के कमांड, जैसे -कमटा -2 (2 दिन से कम पुराना) इसे डायरेक्टरी को डिस्ट्रिब्यूट करने के लिए
  • मैं कुछ उपसर्ग को शामिल करना चाहता हूं ताकि मुझे पता हो कि यह कहां है
  • मुझे ये नहीं लगता था कि मैं कौन सी निर्देशिका चलाता हूँ
  • सीडी कमांड भी अच्छा अभ्यास है।
  • मैं चाहता हूं कि उपनिदेशिका बनाई जाए यदि वे मौजूद न हों

तो

  /my/source/directory/1/foo.txt - & gt; /my/dest/directory/source/directory/1/foo.txt/my/source/directory/2/3/bar.txt - & gt; /my/dest/directory/source/directory/2/3/bar.txt  

मैंने निम्नलिखित कमांड लाइन को एक साथ हॉप किया है लेकिन यह थोड़ा बदसूरत लगता है, क्या कोई बेहतर कर सकता है?

<पूर्व> ढूंढें / मेरे / स्रोत / निर्देशिका -कटाइम -2 -प्रकार f -printf "% P \ n" | कृपया मुझे टिप्पणी करें यदि आपको लगता है कि मुझे इस आदेश पंक्ति को अपने जवाब के रूप में जोड़ना चाहिए, तो कृपया टिप्पणी करें। मैं प्रतिष्ठा के लिए लालची नहीं बनना चाहता था।

यह एक (बंद) प्रश्न के समान उल्लेखनीय है :। मैंने जो जवाब दिया उसे ' ढूंढें | सीपीओ 'अन्य उत्तरों में उल्लिखित समाधान (समय मानदंड घटाएं, लेकिन यह' समान 'और' उसी 'के बीच का अंतर है), और जीएनयू' तारा 'का उपयोग करके एक समाधान की रूपरेखा भी बताता है।

ctime

जब मैंने सोलारिस पर परीक्षण किया, तो जीएनयू न तो और न ही (सोलारिस) सीपीओ सीटीई सेटिंग को संरक्षित करने में सक्षम था; वास्तव में, मुझे यकीन नहीं है कि ऐसा करने का कोई तरीका है। उदाहरण के लिए, स्पर्श कमांड atime या mtime या दोनों सेट कर सकता है - लेकिन ctime नहीं utime () सिस्टम कॉल केवल mtime या atime मान लेता है; यह ctime को संभाल नहीं करता है इसलिए, मेरा मानना ​​है कि यदि आप एक समाधान पाते हैं जो ctime को सुरक्षित रखता है, तो यह समाधान प्लेटफ़ॉर्म-विशिष्ट होने की संभावना है (अजीब उदाहरण: डिस्क डिवाइस को हैक करें और डेटा को इनोड में संपादित करें - पोर्टेबल न होने पर, ऊंचा विशेषाधिकारों की आवश्यकता होती है।) प्रश्न पर पुनः पढ़ना, हालांकि, मुझे लगता है कि 'सीटीएम को संरक्षित करने की आवश्यकताएँ (ओफ़्फ़) का हिस्सा नहीं है; यह केवल कसौटी है कि फाइल कॉपी की गई है या नहीं।

chdir

मुझे लगता है कि ' सीडी ' आवश्यक हैं - लेकिन वे कर सकते हैं पूरी तरह से स्क्रिप्ट या कमांड लाइन के लिए स्थानीयकृत हो, हालांकि, जैसा कि सवाल और नीचे कमांड लाइनों में दिखाया गया है, जिसमें से दूसरा जीएनयू तार मानता है।

  (सीडी / निर्देशिका -कटाइम -2 | सीपीआईओ -पीवीडीएम / मेरा / डेस्ट / डायरेक्टरी) (सीडी / मेरी; स्रोत / निर्देशिका -कटाइम -2 | टार-सीएफ--एफ -एफआई) खोजें | (Cd / my / dest / directory; tar -xf-)  

chdir () (उर्फ सीडी ) का उपयोग किए बिना, आप

रिक्त स्थान, नई लाइनों, आदि के साथ नामों

जीएनयू-विशिष्ट ' find -print0 'और' xargs -0 'बहुत शक्तिशाली और प्रभावी है, जैसा कि एडम हवस ने बताया मजे की बात है, जीएनयू cpio में ' find -print0 ' से आउटपुट को संभालने का एक विकल्प है, और वह ' - null ' या इसके लघु रूप ' -0 ' तो, जीएनयू ढूंढें और जीएनयू cpio का उपयोग कर, सुरक्षित आदेश है:

  (cd / my; source / directory -ctime - 2 -प्रिंट | सीपीआईओ -पीवीडीएम0 / मेरा / डेस्ट / डाइरेक्टरी)  

नोट : यह बैकअप निर्देशिका के तहत पूर्व-मौजूदा फाइलों को अधिलेखित नहीं करता है। इसके लिए -u को cpio कमांड जोड़ें।

इसी प्रकार, GNU tar का समर्थन करता है - null < / कोड> (जाहिरा तौर पर कोई -0 संक्षिप्त रूप से नहीं), और इसका इस्तेमाल भी किया जा सकता है:

  (cd / my; स्रोत / निर्देशिका -कटाई -2 -प्रिंट0 | टावर- cf - -F - --null) | (सीडी / मेरी / डेस्ट / डायरेक्टरी; टीआर-एक्सएफ -)  

रिक्त टर्मिनेटर के साथ फ़ाइल नामों के जीएनयू हैंडलिंग बहुत चालाक है और एक मूल्यवान नवीनता है (हालांकि मुझे केवल इसके बारे में पता है काफी हाल ही में, SO का सौजन्य, यह कम से कम एक दशक तक जीएनयू टार में रहा है।)


Comments