Kompres setiap file dalam direktori menjadi file terkompresi sendiri

24

Bagaimana cara mengompres setiap file dalam direktori ke tarnya sendiri sambil mempertahankan nama untuk setiap file?

yaitu file1.out file2.out

->

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

DD.
sumber

Jawaban:

64

Menempatkan setiap file ke file tar terpisah tidak masuk akal dalam skenario ini. Anda dapat menggunakannya gzipuntuk kompres secara langsung:

gzip *

akan menghasilkan file1.out.gz, file2.out.gzdll.

Anda tarhanya akan menggunakan jika Anda membutuhkan arsip terkompresi sebagai satu file.

Jika Anda membutuhkan arsip tar untuk setiap file, Anda dapat membuatnya seperti:

for i in *; do tar -czf $i.tar.gz $i; done
Sven
sumber
7
+1 - Tidak ada alasan untuk membuat tar (Tape ARchive) untuk satu file. Cukup kompres apa yang ingin Anda kompres - hasilnya akan sedikit lebih kecil, dan jauh lebih masuk akal bagi orang yang mengekstraksi file.
voretaq7
Untuk tar masing-masing subdirektori individu (hanya sedalam satu level) dan hapus yang asli:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.
(tidak dapat mengedit komentar saya di atas setelah 5 menit) Versi yang lebih sederhana / lebih aman:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.
9

Untuk membangun jawaban @ SvenW (yang hanya akan berfungsi pada direktori saat ini), jika Anda memiliki sejumlah besar file atau ingin melakukannya pada struktur direktori rekursif Anda juga dapat menggunakan

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

dan jika Anda perlu memasukkan output ke direktori yang berbeda (dalam contoh ini, ../target) dan tidak ingin menghapus yang asli, Anda dapat melakukan sesuatu seperti:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done
halus
sumber
1
find . -type f -exec gzip {} \;akan cukup. Kode kedua akan gagal dengan nama file yang mengandung spasi dan sejenisnya.
pengguna tidak diketahui
Beberapa shell tidak suka bare {} s, dan yang kedua melakukan sesuatu yang sangat berbeda dari yang pertama (dan saya menyadari masalah jarak tetapi agak sulit untuk ditangani).
lembut
Jika Anda mengetahui shell seperti itu, saya mengundang Anda untuk menjawab pertanyaan saya di sini: unix.stackexchange.com/questions/8647/… . Tidak ada yang bisa menyebutkan sesuatu yang saat ini digunakan sejauh ini. Jika Anda sadar akan risiko jawaban Anda, mungkin ide yang baik untuk menyebutkannya dalam jawaban Anda.
pengguna tidak diketahui
@userunknown Saya dibesarkan pada (t) csh, yang memiliki cukup banyak masalah dengan kawat gigi keriting yang tidak terhapus pada satu waktu, meskipun tampaknya tidak lagi (tapi saya masih melarikan diri {}sebagai kekuatan kebiasaan). Yang lain sudah mempostingnya sebagai jawaban untuk pertanyaan Anda.
lembut
Atau, untuk mengkompres semua file non-biner:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.
0

Coba yang ini:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
Mats
sumber