मैं केवल "खोज" आउटपुट में रिश्तेदार पथ को कैसे बाध्य कर सकता हूं?


25

मैं एक ऐसी स्क्रिप्ट बनाने का प्रयास कर रहा हूं, जो एक ही तारकोल में कई निर्देशिकाओं में एक निश्चित विस्तार के साथ फाइलों को संपीड़ित कर सकती है। वर्तमान में मेरे पास स्क्रिप्ट फ़ाइल में क्या है:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

$rootDirखोज का आधार मार्ग कहाँ है।

यह ठीक है सिवाय पथ टार फ़ाइल में निरपेक्ष हैं। मैं पथ सापेक्ष के लिए पसंद करूंगा $rootDir। मैं ऐसा कैसे कर पाऊंगा?

वर्तमान का उदाहरण tar -tf docs.tarजहां $rootDirहै /home/username/testउत्पादन:

home/username/test/subdir/test.doc
home/username/test/second.doc

क्या मैं उत्पादन की इच्छा:

./subdir/test.doc
./second.doc

जवाबों:


12

यदि आप findवांछित रूट डायरेक्टरी से भाग लेते हैं और एक पूर्ण आरंभ बिंदु को निर्दिष्ट नहीं करते findहैं, तो यह tarकमांड के इनवॉइस के निर्माण के सापेक्ष पथ को आउटपुट करेगा । इस तरह:

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

यदि आप वर्तमान कार्य निर्देशिका को स्थायी रूप से बदलना नहीं चाहते हैं और bashअपने शेल के समान उपयोग कर रहे हैं या कर सकते हैं

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

बजाय।

ध्यान दें कि सभी गोले में पुशड / पॉपड मौजूद नहीं है, इसलिए मैन पेज को उपयुक्त रूप में जांचें। वे बाश में मौजूद हैं, लेकिन बेस श कार्यान्वयन में नहीं हैं, इसलिए स्पष्ट रूप से उपयोग करते समय /bin/bashआप उन पर भरोसा कर सकते हैं यदि कोई स्क्रिप्ट /bin/shइसके बजाय मांगती है (जैसा कि यह छोटे शेल में मैप कर सकता है जिसमें बैश की वृद्धि नहीं है)


धन्यवाद। शानदार ढंग से काम किया। क्या एहसास नहीं था कि linux में pushd / popd था।
शेन

3
या बस का उपयोग करें cd $rootDirऔर cd - (कम से कम bash)। ( cd $rootDir ; find ... )यह भी संभव होगा, यानी सब कुछ एक सब-वे में करना।
डैनियल बेक

9

आप निर्देश %Pमें प्रारूप का उपयोग कर सकते हैं -printf:

find ${rootDir} -name '*.doc' -printf "%P\n"

आपके उदाहरण में प्रदर्शित होगा:

subdir/test.doc
second.doc

फिर आप इस findसूची का उपयोग एक forअभिव्यक्ति में कर सकते हैं, ताकि हमारी निष्पादन कमांड चल सके:

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

1
स्वीकृत समाधान काम करता है लेकिन मूल रूप से एक हैक है। IMHO यह प्रश्न का सही समाधान होना चाहिए।
नागरकोसिको

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