Gunakan gzip untuk mengkompres file dalam direktori kecuali file .gz yang sudah ada

19

Saya memiliki direktori log yang ingin saya buat pekerjaan kompres menggunakan gzip . Masalahnya adalah saya tidak ingin mengkompres ulang log yang sudah saya kompres.

Saya mencoba menggunakan ls | grep -v gz | gzip, tetapi sepertinya itu tidak berhasil.

Apakah ada cara untuk melakukan ini? Pada dasarnya saya ingin gzip setiap file dalam direktori yang tidak berakhir dengan .gz.

jabbajac
sumber

Jawaban:

26

Anda bisa melakukannya:

gzip *

gzip akan memberi tahu Anda bahwa ia melompati file yang sudah memiliki .gz akhiran.
Jika pesan itu menghalangi Anda, Anda dapat menggunakan:

gzip -q *

Apa yang Anda coba tidak berhasil, karena gziptidak membaca nama file file untuk dikompresi dari stdin, untuk itu untuk bekerja Anda harus menggunakan:

ls | grep -v gz | xargs gzip

Anda akan mengecualikan file dengan pola gzdi mana saja dalam nama file, tidak hanya di akhir. ¹ Anda juga harus mencatat bahwa parsing output lsberbahaya ketika Anda memiliki nama file dengan spasi, baris baru, dll., Terlibat.

Solusi yang lebih bersih, tidak bergantung pada gzipmelewatkan file dengan .gzpenutup adalah, yang juga menangani file yang tidak dikompresi dalam subdirektori:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ Seperti yang izkatadikomentari: menggunakan .gzsendiri untuk meningkatkan ini, tidak akan berhasil. Anda harus menggunakan grep -vF .gzatau grep -v '\.gz$'. Itu masih menyisakan bahaya dari pemrosesan lsoutput

Anthon
sumber
1
"... itu membuatnya lebih kecil kemungkinannya untuk mencocokkan beberapa bagian internal dari nama file" - itu grep, cukup gunakan $jadi lebih jelas. Dan Anda tidak melarikan diri ., jadi itu hanya akan mengecualikan file yang dimulai dengan gz(karena mereka tidak memiliki "karakter apa pun sebelumnya gz")
Izkata
1
@Izkata: Tidak, termasuk titik yang tidak terhapus dan tidak mengaitkan regex dengan $akan mengecualikan ( -v) semua file yang memiliki nama yang terdiri dari tiga karakter atau lebih termasuk karakter apa saja yang diikuti oleh "gz" di mana saja dalam nama file. Jadi itu akan termasuk file dengan nama yang dimulai dengan "gz".
Dijeda sampai pemberitahuan lebih lanjut.
1
@ DennisWilliamson Komentar terakhir saya tidak jelas, itu juga akan mengecualikan file dengan gzdi mana saja dalam nama (kecuali awal). Jadi, lebih baik jangkar saja. Setelah tidak digunakan $, terbaca seolah-olah Anda tidak menyadari apa .artinya dalam sebuah regex, maka dari itu komentar yang membingungkan.
Izkata