gzip semua file tanpa menghapusnya


11

Saya perlu gzip semua file dalam direktori secara terpisah termasuk semua file dalam sub-direktori tanpa menghapus yang asli sesudahnya. Jadi katakanlah saya memiliki index.html, saya ingin memiliki di akhir index.html.gzip DAN index.html.

Saya dapat gzip semua file di dir saya via

gzip -r .

Tapi saya juga ingin menyimpan file aslinya.

Apakah ini mungkin?

Jawaban:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

The -cmendorong hasil ke stdout dan terus saja asli. Kerugiannya, Anda harus menemukan file sendiri. Untuk traverse yang lebih canggih, Anda dapat menggunakan find(1), seperti di atas: .pencarian dimulai dari direktori saat ini, dan -type fmengembalikan nama setiap file biasa.


Kenapa *.*masuk ls?

@pooh: *.*cocok dengan semua file yang diberi nama secara teratur, dan biasanya tidak ada direktori. Tentu saja, ini hanya berfungsi dalam banyak kasus dan biasanya tidak jika Anda membutuhkannya. Kemudian gunakan findperintah.
Boldewyn

@Boldewyn: pertanyaannya adalah gzip semua file dalam direktori. ls *.*tidak akan memilih file seperti TODO .

lstidak diperlukan sama sekali : for x in *. Namun, findharus menggunakan find . -type f | while read -r x.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban yang diperbarui. Terima kasih sudah -rmenghidupkan read.
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

Anda dapat dengan mudah beralih untuk memasukkan apa yang ingin Anda kompres ( -name '*.txt -or -name '*.htmldll.) Daripada seperti sekarang, mengecualikan beberapa file (sudah dikompresi, cadangan dan file sementara).

Menangani spasi dalam nama file juga.

Ubah gzipke echo gzipuntuk pengujian. Atau lewati bagian -exec bersama-sama.

Sunting: Oh, saya lupa menyebutkan bahwa ini tidak memeriksa apakah <target>.gzsudah ada. Ini mungkin atau mungkin tidak menjadi masalah.

Edit2: Ok, ini dia sesuatu yang memeriksa file yang ada. Jika itu mungkin diinginkan. Maafkan oneliney-ness.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

My find-foo mungkin bukan apa yang bisa dilakukan, sangat mungkin untuk langsung lewati.


1
cukup baca bahwa -nama harus muncul sebelum -type untuk menghindari panggilan stat pada setiap file.

@ Ben Masuk akal, masukan yang bagus! Untuk pohon besar mungkin terlihat.
plundra



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.