लिनक्स अलग-अलग अभिलेखागार में कई उपनिर्देशिका gzip?


16

मैं अलग-अलग अभिलेखागार में उपनिर्देशिका को कैसे संपीड़ित कर पाऊंगा?

उदाहरण:

directory
 subdir1
 subdir2

Subdir1 (.tar) .gz और subdir2 (.tar) .gz बनाना चाहिए

जवाबों:


27

यह छोटी स्क्रिप्ट आपकी आवश्यकताओं को देखते हुए, आपका सबसे अच्छा विकल्प प्रतीत होती है:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

यह अपने नाम में रिक्त स्थान के साथ निर्देशिकाओं को ठीक से संभालता है।


यह मुझे यह त्रुटि देता है: bash: -c: पंक्ति 1: वाक्यविन्यास त्रुटि: फ़ाइल का अप्रत्याशित अंत
EarthMind

@EarthMind: यह यहाँ ठीक काम करता है। जांचें कि स्क्रिप्ट सही तरीके से कॉपी की गई थी या नहीं।
जुलियानो 18

@EarthMind: मुझे यकीन नहीं है कि आपने मूल प्रश्न को अच्छी तरह समझा दिया है। आप इसे फिर से चलाना चाहते हैं और पूर्व .tar.gz फ़ाइलों को छोड़ते समय नई .tar.gz फाइलें प्राप्त करना चाहते हैं? "Tmstamp = $ (दिनांक '+% Y% m% d-% H% M')" जोड़ने का प्रयास करें और $ {base} को $ {base} - $ {tmstamp} में बदलें।
Freiheit

2
@EarthMind: यदि आप सब कुछ एक पंक्ति में रखने जा रहे हैं, तो सुनिश्चित करें कि टार कमांड से ठीक पहले अर्धविराम (;) है। अन्यथा, शेल असिस्ट वेरिएबल होने के बजाय, टार को एक पर्यावरण चर के रूप में पारित किया जाता है।
जुलियानो

@mwojtera अपने प्रयास किया संपादित अपनी ही जवाब होना चाहिए
चूजों

10

इस बारे में कैसा है: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

स्पष्टीकरण: आप वर्तमान निर्देशिका में सभी आइटमों पर एक खोज चलाते हैं। Maxdepth 0 इसे दिए गए तर्कों की तुलना में किसी भी कम की पुनरावृत्ति नहीं करता है। (इस मामले में *, या आपके वर्तमान निर्देशिका में सभी आइटम) 'd' तर्क "-प्रकार" केवल निर्देशिकाओं से मेल खाता है। फिर जो भी मैच होता है उस पर टार रन करते हैं। ({} मिलान फ़ाइल द्वारा प्रतिस्थापित किया जाता है)


1
लेकिन फिर भी मुझे यह त्रुटि मिलती है कि दिया गया मार्ग एक निर्देशिका है और फाइल नहीं है
EarthMind

3
gzip अकेले निर्देशिकाओं को संग्रहित नहीं करता
जूलियानो

इससे पहले कि आप उन्हें gzip कर सकें, आपको निर्देशिकाओं को टारगेट करना होगा।
ℝफिंक

1
आपको z विकल्प के साथ टार की आवश्यकता है, निर्देशिका के लिए सीधे gzip नहीं। हालांकि, उपयोग का बहुत अच्छा उपयोग।
Freiheit

3
त्रुटि: "खोज: पथ पूर्व अभिव्यक्ति होना चाहिए:;" पहला भाग काम करता है, इसलिए मैंने इस्तेमाल किया (केवल निर्देशिकाएं): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
जोसेफ

4

यह प्रत्येक फाइल के लिए blah.tar.gz नामक एक फाइल बनाएगा, जो कि blah नामक एक डायरेक्टरी में है।

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

अगर आपको डायरेक्टरी में बस डायरेक्टरी से ज्यादा मिला है (यानी फाइल के साथ-साथ एलएस भी डायरेक्टरी में सब कुछ वापस कर देगा), तो इसका इस्तेमाल करें:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Grep -v वर्तमान निर्देशिका को बाहर करता है जो findडिफ़ॉल्ट रूप से कमांड में दिखाई देगा ।


3
Ls और find दोनों को इस तरह से उपयोग करने के लिए नहीं बनाया गया था। विशेष रूप से ls, यह उपयोगकर्ता-पठनीय सूची में फ़ाइलों को प्रस्तुत करने के लिए है, न कि फ़ाइल सूचियों को 'के लिए' तर्क के रूप में प्रस्तुत करने के लिए। बस का उपयोग करेंfor dir in *
जूलियानो

1
मैंने आपका पहला सुझाव देने की कोशिश की है, लेकिन यह उनके नाम पर रिक्त स्थान वाली निर्देशिकाओं के साथ काम नहीं करता है
EarthMind

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