Yanıtlar:
Her dosyayı ayrı bir tar dosyasına koymak bu senaryoda bir anlam ifade etmemektedir. gzip
Onları doğrudan sıkıştırmak için kullanabilirsiniz :
gzip *
sonuçlanacaktır file1.out.gz
, file2.out.gz
vb
tar
Tek 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
find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
@ 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
find . -type f -exec gzip {} \;
yeterli olacak. İkinci kod boşluk ve benzeri dosya isimlerinde başarısız olacaktır.
{}
de alışkanlık kuvveti olarak kaçıyorum). Bununla birlikte, başkaları da sorunuzu cevap olarak yayınlamışlardır.
find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
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