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.