Bir dizindeki her dosyayı kendi sıkıştırılmış dosyasına sıkıştırın


24

Her dosyanın adını korurken, bir dizindeki her dosyayı kendi katranına nasıl sıkıştırabilirim?

yani file1.out dosya2.out

->

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

Yanıtlar:


64

Her dosyayı ayrı bir tar dosyasına koymak bu senaryoda bir anlam ifade etmemektedir. gzipOnları doğrudan sıkıştırmak için kullanabilirsiniz :

gzip *

sonuçlanacaktır file1.out.gz, file2.out.gzvb

tarTek bir dosya olarak sıkıştırılmış bir arşive ihtiyacınız olursa kullanırsınız .

Her dosya için bir tar arşivine ihtiyacınız varsa, aşağıdaki şekilde oluşturabilirsiniz:

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

7
+1 - Tek bir dosya için katran (Bant Arşivi) oluşturmak için hiçbir sebep yok. Sadece sıkıştırmak istediğinizi sıkıştırın - sonuç marjinal olarak daha küçük olacak ve dosyaları ayıklayan kişilere sınırsızca anlam kazandırın.
— voretaq7

Her bir alt dizini katmak (sadece bir seviye derinliğinde) ve orijinali kaldırmak için:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
— xb.

(5 dakika sonra yukarıdaki yorumumu değiştiremiyorum) Daha basit / daha güvenli bir sürüm:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
— xb.

9

@ SvenW'nin cevabını (sadece şu anki dizinde çalışacak olan) üzerine inşa etmek için, çok sayıda dosyaya sahipseniz ya da özyinelemeli bir dizin yapısında yapmak istiyorsanız,

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

ve çıktıyı farklı bir dizine koymanız gerekirse (bu örnekte, ../target) ve orijinalleri kaldırmak istemiyorsanız, şöyle bir şey yapabilirsiniz:

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 {} \;yeterli olacak. İkinci kod boşluk ve benzeri dosya isimlerinde başarısız olacaktır.
— kullanıcı bilinmeyen

Bazı mermiler çıplak {} lardan hoşlanmaz ve ikincisi ilkinden belirgin bir şekilde farklı bir şey yapar (ve boşluklarla ilgili sorunların farkındaydım, ancak bununla başa çıkmak biraz zor).
— kabarık

Eğer böyle bir kabuk biliyorsanız, buradaki sorumu yanıtlamaya davet ediyorum: unix.stackexchange.com/questions/8647/… . Bugün hiç kimse şu anda kullanımda olan bir şeyi adlandıramadı. Cevabınızın bir riskinin farkındaysanız, cevabınıza bir isim vermek iyi bir fikir olabilir.
— kullanıcı bilinmeyen

@ userunknown (t) csh'e çıktım, bir kerede çıkmaz kaşlı ayraçlarla ilgili oldukça fazla sorun yaşadım, ancak artık görünmese de (ama yine {}de alışkanlık kuvveti olarak kaçıyorum). Bununla birlikte, başkaları da sorunuzu cevap olarak yayınlamışlardır.
— kabarık

Veya, tüm ikili olmayan dosyaları sıkıştırmak için:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
— xb.

0

Bunu dene:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
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.