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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.