निर्देशिका में प्रत्येक फ़ाइल को अपनी संपीड़ित फ़ाइल में संपीड़ित करें


24

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

यानी file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

जवाबों:


64

हर फाइल को एक अलग टार फाइल में डालने से इस परिदृश्य में कोई मतलब नहीं है। आप gzipउन्हें सीधे संपीड़ित करने के लिए उपयोग कर सकते हैं :

gzip *

परिणाम होगा file1.out.gz, file2.out.gzआदि।

आप tarकेवल तभी उपयोग करेंगे जब आपको एक एकल फ़ाइल के रूप में एक संपीड़ित संग्रह की आवश्यकता होगी।

यदि आपको प्रत्येक फ़ाइल के लिए एक टार संग्रह की आवश्यकता है, तो आप इसे इस तरह बना सकते हैं:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1 - एकल फ़ाइल के लिए टार (टेप ARchive) बनाने का कोई कारण नहीं है। बस जो आप संपीड़ित करना चाहते हैं उसे संपीड़ित करें - परिणाम मामूली रूप से छोटा होगा, और फ़ाइलों को निकालने वाले लोगों को असीम रूप से अधिक समझ में आएगा।
voretaq7

प्रत्येक व्यक्ति उपनिर्देशिका (केवल एक स्तर गहरा) को टार करने के लिए और मूल को हटा दें:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb।

(5 मिनट के बाद मेरी टिप्पणी ऊपर संपादित नहीं कर सकते हैं) एक सरल / सुरक्षित संस्करण:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb।

9

@ SvenW के उत्तर का निर्माण करने के लिए (जो केवल वर्तमान निर्देशिका पर काम करेगा), यदि आपके पास बड़ी संख्या में फाइलें हैं या आप इसे पुनरावर्ती निर्देशिका संरचना पर करना चाहते हैं तो आप भी उपयोग कर सकते हैं

find . -type f -exec gzip \{\} \;

और अगर आपको आउटपुट को एक अलग निर्देशिका (इस उदाहरण में ../target) में डालने की आवश्यकता है, और मूल को निकालना नहीं चाहते हैं, तो आप कुछ कर सकते हैं:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;पर्याप्त होगा। दूसरा कोड रिक्त स्थान और पसंद जैसे फ़ाइल नाम के साथ विफल हो जाएगा।
उपयोगकर्ता अज्ञात

कुछ गोले नंगे {} को पसंद नहीं करते हैं, और दूसरा व्यक्ति पहले की तुलना में कुछ अलग करता है (और मुझे रिक्ति के मुद्दों के बारे में पता था लेकिन इससे निपटने के लिए बहुत मुश्किल है)।
शराबी

यदि आप इस तरह के शेल को जानते हैं, तो मैं आपको यहाँ पर अपने प्रश्न का उत्तर देने के लिए आमंत्रित करता हूं: unix.stackexchange.com/questions/8647/… । किसी को कुछ भी नाम नहीं मिला था जो आज तक उपयोग में है। यदि आप अपने उत्तर के जोखिम के बारे में जानते हैं, तो इसे अपने उत्तर में नाम देना एक अच्छा विचार हो सकता है।
उपयोगकर्ता अज्ञात

@userunknown I को (t) csh पर लाया गया था, जिसे एक समय में एक ही तरह के घुंघराले ब्रेसिज़ से काफी परेशानी थी, हालाँकि यह अब तक दिखाई नहीं देता है (लेकिन मैं अभी भी {}एक आदत के रूप में बचता हूँ )। अन्य लोगों ने पहले ही आपके प्रश्न के उत्तर के रूप में पोस्ट कर दिया है।
शराबी

या, सभी गैर-बाइनरी फ़ाइलों को संपीड़ित करने के लिए:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb।

0

इसको आजमाओ:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.