tüm dosyaları silmeden gzip


11

Daha sonra orijinalleri silmeden alt dizinlerdeki tüm dosyalar da dahil olmak üzere bir dir tüm dosyaları ayrı ayrı gzip gerekir. Diyelim ki index.html var, sonunda index.html.gzip AND index.html istiyorum.

Yolumdaki tüm dosyaları gzip edebiliyorum

gzip -r .

Ama orijinal dosyaları da saklamak istiyorum.

Mümkün mü?

Yanıtlar:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

-cStdout'a sonucu iter ve orijinal tek başına tutar. Dezavantajı, dosyaları kendiniz bulmanızdır. Daha karmaşık gezinme için, find(1)yukarıdaki gibi kullanabilirsiniz : geçerli .dizinden başlayarak arama yapar ve -type fher normal dosyanın adını döndürür.


Neden *.*içinde ls?

@pooh: *.*düzenli olarak adlandırılmış tüm dosyaları eşleştirir ve genellikle dizinlerle eşleşmez. Tabii ki, sadece çoğu durumda çalışır ve genellikle ihtiyacınız varsa değil. Ardından findkomutu kullanın.
Boldewyn

@Boldewyn: soru dir içindeki tüm dosyaları gzip etmekti. TODOls *.* gibi dosyaları seçmez .

lsgerekli değildir hiç : for x in *. Ancak, kullanılması findgerekir find . -type f | while read -r x.
sonraki duyuruya kadar duraklatıldı.

Cevap güncellendi. İçin teşekkürler -rüzerindeki anahtar read.
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

-name '*.txt -or -name '*.htmlBazı dosyalar (zaten sıkıştırılmış, yedek ve geçici dosyalar) hariç olmak üzere, şimdi olduğu gibi sıkıştırmak istediğiniz şeyi ( vb.) Dahil etmek için kolayca değiştirebilirsiniz .

Dosya adındaki boşlukları da gayet iyi işler.

Değişim gzipiçin echo gziptest için. Veya -exec bölümünü birlikte atlayın.

Düzenleme: Oh, bu <target>.gzzaten var olup olmadığını kontrol olmadığını belirtmeyi unuttum . Bu bir sorun olabilir veya olmayabilir.

Edit2: Tamam, burada mevcut dosyayı kontrol eden bir şeyle gidiyoruz. Bu istenebilirse. Bağımlılığı affedin.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

Benim find-foo belki ne olabilir, doğrudan bulmak için atlamak mümkün olabilir.


1
sadece her dosyada stat çağrısından kaçınmak için -name -tipinden önce gelmelidir.

@Ben Mantıklı, iyi girdi! Büyük ağaçlar için fark edilebilir.
plundra



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.