Bash

2012-04-28 31 views
17

'daki tüm alt dizinlerdeki tüm dosyaları gziplemek için Geçerli konumumun alt dizinleri arasında yineleme yapmak ve her dosyayı ayrı ayrı gziplemek istiyorum. Bir dizindeki dosya sıkıştırma için, benBash

for file in *; do gzip "$file"; done 

kullanmak ama bu sadece geçerli dizine ve geçerli dizinin değil alt dizinleri üzerinde çalışabilirsiniz. Yukarıdaki deyimleri yeniden yazabilirim, böylece tüm alt dizinlerdeki dosyaları da sıkıştırır?

cevap

41

fazla find ve gzip döngüler ya da bir şey gerek yoktur:

find . -type f ! -name '*.gz' -exec gzip "{}" \; 

Bu ve adları .gz uzantılı bitmez geçerli bir dizinin altındaki tüm düzenli dosyaları bulur (yani , zaten sıkıştırılmamış tüm dosyalar). Her dosyaya ayrı ayrı gzip çağırır. user unknown den Yorum dayalı


Düzenleme:

küme parantezleri ({}) Gördüğünüz gibi -exec aşağıdaki komuta tek bir kelime olarak, doğrudan geçirilen dosya, değiştirilir burada:

$ touch foo 
$ touch "bar baz" 
$ touch xyzzy 
$ find . -exec echo {} \; 

./foo 
./bar baz 
./xyzzy 
+2

Son cümlenin ortak bir yanlış bilgilendirme olduğunu. Bir dosya adının nerede başladığını ve nerede bittiğini öğrenin. Kendisi, boşluklar, linebreaks ve diğer komik şeyler ile ilgili herhangi bir problem yaşamaz. Yani -exec gzip {} 'gzip'i tek bir dosya adıyla çağırır ve ara boşluğu çağrılmadığı için, boşluğu sınırlayıcı olarak yorumlayabilen gzip, tüm dosya adını alır. Bulgunun manpageindeki ipucu güncelliğini yitirmiş ve şu anlama gelir: Kabuğunuz onu bulmak için geçmeden önce {} yorumlamaya çalışabilir, ancak yıllarca böyle bir kabuk görülmemiştir (http://unix.stackexchange.com/q/) 8647/4485). –

+1

Her gün yeni bir şeyler öğreniyorsunuz. Ders için teşekkürler! Exclude * .gz dosyaları için –

+2

+1 – GuruM

5
find . -type f | while read file; do gzip "$file"; done 
+1

Bir dosyada boşluk veya başka özel karakterler varsa ne olur? O için çalışıyoruz – c00kiemon5ter

+1

@ c00kiemon5ter Bir cevap çalışır, ancak eksik olabilir bir düşüşü hak ediyor mu? SO'ya göre "Her zamanki gibi özensiz, çaba sarf etmeyen bir gönderiye veya açıkça ve belki de tehlikeli bir şekilde yanlış olan bir yanıtla karşılaştığınızda aşağı çekilmelerinizi kullanın." Bu cevap o şeylerin hiçbiri değil. Tamamlanmamış, biraz özensiz, ancak yanlış değil. Muhtemelen yükseltme işleminin ücretini almasına izin vermeli ve bir yorum bırakmış olmalısınız. –

+0

imo, cevap yanlış. Farshid, dosyaların hiçbir özel karakter içermediğini asla belirtmemiş, bu nedenle cevabınız sadece sorunun özel bir durumunu yanıtlıyor. Bulmaktan daha iyisin .. | okurken .. '. Cevabınızı düzeltin ve ilk cevap vereceğim. Ama yanlış (imo) cevapları teşvik etmemi istemiyorsunuz. – c00kiemon5ter

11

Ben aynı şeyi yapar ama kısadır gzip -r ./ tercih ediyorum.