2011-04-21 18 views
15

निम्नलिखित एक स्क्रिप्ट से एक स्निपेट है जो को एक उपदिर में सभी php फ़ाइलों को टैर करने के लिए प्रयास करता है। यह --include 'पैरामीटर उपयोग करने के लिए कोशिश करता है लेकिन काम करने के लिए प्रतीत नहीं होताटैर के साथ - अंतर्निहित पैटर्न

+ find . -name '*.php' 
./autoload.php 
./ext/thrift_protocol/run-tests.php 
./protocol/TBinaryProtocol.php 
... 
./transport/TTransportFactory.php 
+ tar -cvjf my.tar.bz2 '--include=*.php' . 
+ set +x 

find कई php फ़ाइलें मिली लेकिन टार को देखने के लिए प्रतीत नहीं होता है (उत्पादन से बैश में' -x सेट 'है) उन्हें। अगर मैं --include निकालता हूं तो सभी फाइलें रुक जाती हैं।

मुझे पता है कि मैं सूची (find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -) को फ़ीड करने के लिए ढूंढ सकता हूं, लेकिन --include परम के साथ क्या गलत है?

+0

unix.stackexchange.com –

+0

पर अंतर्गत आता है हम्म यदि ऐसा है तो - वहाँ वास्तव में इतने पर एक 'tar' टैग होना चाहिए? – nhed

+4

@ नहेड 'जीएनयू टैर' और न ही 'बीएसडी टैर' पहचान '- शामिल'। आप 'टैर' का किस संस्करण का उपयोग कर रहे हैं? – cnicutar

उत्तर

6

असल में मैंने अपने फ्रीब्स सिस्टम पर tar(1) में देखा और मुझे एक - विकल्प शामिल मिला (पहले मैंने कुछ पुराने मैन पेज को ऑनलाइन देखा था)। --include विकल्प काफी शक्तिशाली है। यहाँ कुछ उदाहरण

इन फ़ाइलों

[email protected] ~/tar_test $ ls -1 
a.c 
b.c 
x 

सरल टार, संग्रह सब कुछ

[email protected] ~/tar_test $ tar -cvf archive1.tar * 
a a.c 
a b.c 
a x 

आर्काइव केवल सी फ़ाइलें हैं

[email protected] ~/tar_test $ tar -cvf archive2.tar --include='*.c' * 
a a.c 
a b.c 

तो आपकी स्क्रिप्ट में शायद गलत क्या है कि आप अंतिम तर्क के रूप में .* के बजाय . देते हैं।

संपादित

मैं इसे करने की कोशिश की और आश्चर्य हुआ है। tar(1) का व्यवहार अप्रत्याशित है लेकिन (मुझे विश्वास है) इरादा है। मैन पेज कहता है:

Process only files or directories that match the specified pattern. 

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

तो निष्कर्ष में मेरा मानना ​​है कि + फिल्टर फ़ाइलों को दोबारा गणना करने के लिए किसी अन्य तरीके का उपयोग करना सबसे अच्छा होगा।

+0

क्या आपने कोई रिकर्सन करने का प्रयास किया था? 'ज़िप 'के विपरीत,' tar' डिफ़ॉल्ट रूप से रिकर्सिव है। ऐसा लगता है कि यहां तोड़ना है। मुझे बेहतर पसंद आया ** यह पोर्टेबल नहीं है, इसका उपयोग न करें ** दृष्टिकोण। मेरा मतलब है कि अगर मैं एक ही चीज़ 'tar -cvf x.tar * .c' के साथ पूरा कर सकता हूं तो यह भी क्यों है? – nhed

+1

क्या यह आदेश सभी '* .c' फ़ाइलों को कम करने के लिए पर्याप्त नहीं है ?:' tar -cvf archive2.tar * .c' – yeliabsalohcin

+0

- शामिल विकल्प विकल्प v1.30 के रूप में gnu tar में मौजूद नहीं है! – Enzo

46

जीएनयू टैर में -T or --files-from option है जो फ़ाइल को शामिल करने के लिए पैटर्न की एक सूची ले सकता है। इस विकल्प के साथ निर्दिष्ट फ़ाइल stdin के लिए "-" हो सकती है। तो, आप -files-from- का उपयोग कर stdin से संग्रह करने के लिए टैर के लिए फ़ाइलों की मनमानी सूची पास कर सकते हैं। आपका उदाहरण बन जाता है:

find . -name '*.php' | tar -cvjf my.tar.bz2 --files-from - 
+1

स्वीकृत उत्तर मेरे लिए काम नहीं करता है, लेकिन यह बहुत अच्छा है! – vsnyc

+1

इसके अलावा, यदि आप ऐसी चीजें रखना चाहते हैं जो एकाधिक पैटर्न से मेल खाते हैं तो टैर फ़ाइल में जाएं, आप ऐसा कुछ कर सकते हैं: ढूंढें। -रेगेक्स "। * \। php" -o -regex "। * \। सीएसएस" | tar cvzf stuff.tgz --files-from - –

+0

इसमें खाली निदेशकों को शामिल नहीं किया जाएगा, है ना? –

संबंधित मुद्दे