टार फाइलें केवल, कोई निर्देशिका नहीं


16

मैं शायद केवल फ़ाइलों को खोजने के लिए एक शेल स्क्रिप्ट लिख सकता हूं, फिर सूची को टार में पास कर सकता हूं, लेकिन मैं सोच रहा हूं कि क्या पहले से ही एक अंतर्निहित सुविधा है जो टार में है जो कि केवल एक ही कमांड लाइन में ऐसा करने की अनुमति देता है?

उदाहरण के लिए, मुझे --no-recursionस्विच मिला , लेकिन जब मैं करता हूं:

tar --no-recursion -cvf mydir.tar mydir

यह केवल निर्देशिका में प्रविष्टियों के नाम (उपनिर्देशिका सहित!) को संग्रहीत करता है, लेकिन यह किसी भी फाइल को संग्रहीत नहीं करता है।

मैंने भी कोशिश की:

 tar --no-recursion -cvf mydir.tar mydir/*

लेकिन जब यह केवल फाइलें संग्रहीत करता है, तो यह उपनिर्देशिकाओं के नामों को भी संग्रहीत करता है ।

क्या केवल टार फाइल्स को बताने का कोई तरीका है, कोई निर्देशिका नहीं है?


5
बस स्पष्ट करने के लिए: क्या आप "फ्लैट" संरचना के साथ एक संग्रह बनाना चाहते हैं (यानी सभी फाइलें एक निर्देशिका में मिश्रित होती हैं)?
rozcietrzewiacz

1
आप एक नई निर्देशिका बना सकते हैं find mydir -type f |xargs cp -t tempdirऔर उसके बाद टेंपर्ड बना सकते हैं ।
केविन

@rozcietrzewiacz हाँ, फ्लैट, लेकिन केवल उस निर्देशिका से, उपनिर्देशिकाओं से नहीं।
Ateiob

1
ठीक है, मुझे लगता है कि मैं देख रहा हूं कि आप क्या करने की कोशिश कर रहे हैं। कैसे के बारे मेंfind mydir -depth 1 -type f | xargs tar cf mydir.tar
केविन

2
आह, रिक्त स्थान। खोजने के उपयोग के बजाय -exec है: find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} ++कहते हैं सब xargs की तरह एक ही कमांड लाइन पर फ़ाइलें।
केविन

जवाबों:


11

जैसा कि कैमह बताते हैं, पिछली कमांड में बहुत सी फ़ाइल नाम दिए गए थे, यह एक छोटी सी समस्या थी, यह एक से अधिक बार निष्पादित करेगा, बाद में इनवोकेशन चुपचाप पिछले रन मिटा देता है। चूंकि हम बहुत कम नहीं कर रहे हैं, इसलिए हम अधिलेखित होने के बजाय संलग्न कर सकते हैं:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

Iocnarz के जवाब का उपयोग करने का tarहै --nullऔर -Tविकल्प के रूप में अच्छी तरह से काम करता है। यदि आपने cpioस्थापित किया है, तो इसका उपयोग करने वाले कैम का जवाब भी ठीक है। और अगर आपके पास है zshऔर इसे कमांड के लिए उपयोग करने में कोई आपत्ति नहीं है, तो गिल्स का जवाब एक zsh ग्लॉब ( *(.)) का उपयोग करके सबसे सीधा लगता है।


कुंजी -maxdepthविकल्प था । अंतिम उत्तर, रिक्त स्थान से उचित तरीके से निपटना:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

यह भी काम करना चाहिए:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

4
इन दोनों के परिणामस्वरूप कई चालान हो सकते हैं tar। दोनों xargsऔर findके साथ +संस्करण तर्क टार के लिए पारित किया जा सकता है की अधिकतम संख्या है। यह टार के दूसरे आह्वान के परिणामस्वरूप पहले के आउटपुट को अधिलेखित करेगा।
22

2
Xargs सीमा पर विस्तार, xargs अधिकतम 128KiB कमांड लाइन के लिए डिफ़ॉल्ट है। यदि फ़ाइल सूची बड़ी है, तो आपको कमांड (टार) का एक दूसरा (या अधिक) आह्वान मिलता है, जिससे मौन डेटा हानि होती है। आप -xडेटा खोने के बजाय xargs को विफल करने के लिए मजबूर करने के लिए उपयोग कर सकते हैं , और एक मौन डेटा हानि बग की तुलना में बेहतर है, यह अभी भी आदर्श नहीं है। यह सॉर्ट बग इतना खतरनाक है क्योंकि पहली बार में सब कुछ ठीक लगता है, लेकिन जैसे-जैसे समय के साथ फाइल सूची बढ़ती जाती है, आप इसे ट्रिगर करना शुरू कर देते हैं और तब तक नोटिस नहीं कर सकते जब तक आप अपने बैकअप को पुनर्स्थापित करने का प्रयास नहीं करते। फिर बहुत देर हो चुकी है।
कैम

@camh आप सही कह रहे हैं, इस ओर इशारा करने के लिए धन्यवाद; मैंने उसे प्रतिबिंबित करने के लिए अपडेट किया है।
केविन

1
"अंतिम उत्तर" सही नहीं है, यदि आप "टर सी" का उपयोग करते हैं-तो आपको आंशिक परिणाम मिल सकते हैं।
Eckes

14

जब आप के findसाथ उपयोग करना चाहते हैं tar, तो cpioइसके बजाय सबसे अच्छा तरीका उपयोग करना है tarcpioटार अभिलेखागार लिख सकते हैं और स्टड से संग्रह करने के लिए फ़ाइलों की सूची लेने के लिए डिज़ाइन किया गया है।

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

का उपयोग करना findऔर cpioअधिक यूनिक्स-वाई दृष्टिकोण है जिसमें आप findफ़ाइल चयन को उस पूरी शक्ति के साथ करते हैं जो इसके पास है, और cpioसंग्रह करने दें। यह इस सरल उपयोग को सीखने के लायक है cpio, जैसा कि आप समस्याओं को हल करने में आसान पाते हैं जब आप प्रयास करते समय अपने आगे धमाका करते हैं tar


प्रतिभाशाली! मैंने दूर के अतीत में cpio का उपयोग किया है, लेकिन ustar विकल्प के बारे में कभी नहीं पता था।
इयान मैक्गोवन

2
स्वीकृत उत्तर की तुलना में इसने मेरे लिए बहुत बेहतर काम किया।
डेल एंडरसन

1
सिर्फ एक निट। -maxdepth 1 को
-type

साभार @kdubs मैं डाल करने के लिए इस सवाल का जवाब नवीनीकृत किया है -maxdepthपहले -type
कॅाम

3

मुझे यकीन नहीं है कि मैं आपकी आवश्यकताओं को समझता हूं। यदि आप नियमित फ़ाइलों को संग्रहीत करना चाहते हैं, mydirलेकिन इसके उपनिर्देशिकाओं को नहीं, तो सबसे आसान तरीका है, ज़ीश का उपयोग करना, जहाँ नियमित फ़ाइलों का मिलान करना केवल . ग्लोब क्वालीफायर का उपयोग करने का सरल मामला है :

tar cf mydir.tar mydir/*(.)

3

आप भी उपयोग कर सकते हैं find ... -print0और tar ... --nullसीधे उपयोग किए बिना xargs

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

दिए गए उदाहरण में, --no-recursionकरने के लिए विकल्प tarहै क्योंकि फ़ाइलें (और नहीं निर्देशिका) का ही पथ से पारित हो जाएगा आवश्यक नहीं है findकरने के लिए tar

हालांकि, निम्न उदाहरण में --no-recursionविकल्प का उपयोग करना tar, tarदोहरी संग्रह निर्देशिकाओं से रोकता है। उसके बाद findडायरेक्टरी ट्री रिक्रिएशन करेंगे tar

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl

2

जैसा कि परिचयात्मक अनुच्छेद man tarकहता है (अंतिम वाक्य),

एक निर्देशिका नाम का उपयोग हमेशा से होता है कि नीचे उपनिर्देशिका को संग्रह में शामिल किया जाना चाहिए।

जिसे मैं आपके प्रश्न का "नहीं" उत्तर समझता हूं।


अच्छा पकड़ है, को छोड़कर टार अब कई बहिष्कार meachisms शामिल हो (उदाहरण के लिए --no-recursion, --exclude-tag, आदि)। मैं देख रहा हूँ --exclude-tagजो आशाजनक लग रहा है लेकिन मैं जो देख रहा हूँ उसके ठीक विपरीत प्रतीत होता है।
एटियोब नोव

मैंने यह कोशिश की और मैंने देखा कि पात्रों को लंबे रास्ते से हटाया जा रहा है। प्रस्तावित के रूप में -T और --null के साथ टार के उपयोग से इस समस्या से बचा जा सकता है।
पॉल ब्रैनन

1
star -c -C startdir -find . ! -type d > out.tar

न आना -C startdirऔर की जगह .के साथ startdirअगर यह संग्रह में दिखाई देनी चाहिए।

यह कामेच्छा की सुविधाओं के आधार पर सबसे कुशल विधि है। Libfind भी प्राइमरी प्रस्तुत करता है -chown -chgrp -chmodजो जगह-जगह स्ट्रक्चर स्टेट को संशोधित करता है और विभिन्न मेटाडेटा को संग्रहीत करने की अनुमति देता है। यह भी सूची और निकालने के मोड में काम करता है और कई मामलों में पूरे संग्रह को निकालने की आवश्यकता से बचा जाता है।


क्या आप मोड -findमें उपयोग कर सकते हैं -copyमैन पेज सिनॉप्सिस आपको सुझाव देता है, लेकिन मैं इसे काम करने में सक्षम नहीं हुआ ( फ़ोल्डर संरचना को संरक्षित करते हुए संशोधित फ़ाइलों की प्रतिलिपि बनाने की कोशिश करते हुए ) (schily-2016-02-10 के साथ)
स्टीफन चेज़लस

मैंने लंबे समय तक इसका परीक्षण नहीं किया। यह हो सकता है कि वर्तमान में एक बग है। मैन पेज कहता है कि अंतिम तर्क निष्कर्षण निर्देशिका होगा, लेकिन जब मैं यह कोशिश करता हूं, तो मुझे मिलता है: "पथ तर्क अभी तक निकालने के मोड में समर्थित नहीं हैं"। जब आप कोशिश करते हैं तो क्या यह आपको मिलता है?
शास्त्री

हाँ। मैन पेज यह भी कहता है कि आपको केवल-ऑर्गॅमेंट के बाद ही तर्क मिल सकते हैं, लेकिन यदि मैं डेस्टिनेशन डायरेक्टरी को
-फर्स्ट

निकालने की प्रक्रिया में खोज कोड को बंद करने के लिए कोड है और त्रुटि संदेश एक गलत जांच से है जो -सी की अपेक्षा करता है, लेकिन -copy को भी अनुमति देना चाहिए। -कोपी मोड में, खोज पार्सर में अंतिम तर्क शामिल नहीं होना चाहिए।
शास्त्री

1
एक अंतिम समाधान अब sourceforge.net/projects/schilytools/files/schily-2016-03-11.tar.bz2 पर schily टूल्स में प्रकाशित किया गया है। यह स्टार में एक लापता सेटलोकाले () से एक समस्या को भी ठीक करता है और यह सक्षम करता है - सी के लिए निर्देशन star -find
10

0

मुझे कोई हल मिल गया होगा।

find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -

यह थोड़ा महंगा हो सकता है, लेकिन वैसे भी यह काम करेगा, क्योंकि यह xargs पर निर्भर नहीं करता है।


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