Saya ingin membuat file gzip yang mempertahankan nama file asli. Misalnya gzipping "example.txt" harus menampilkan file gzipped bernama "example.txt" daripada "example.txt.gz." Apakah mungkin untuk melakukan ini secara elegan dengan satu perintah (tidak melakukan yang berikutnya mv
)?
14
Jawaban:
Ini tidak bekerja:
Ini adalah kondisi lomba:
Masalahnya adalah bahwa
> example.txt
(ataudd of=example.txt
dalam hal ini) membunuh file sebelum proses lain memiliki kesempatan untuk membacanya. Jadi tidak ada solusi yang jelas, itu sebabnya Anda harus tetap berpegang padamv
.Ada beberapa cara Anda bisa menipu. Anda dapat membuka file tersebut, kemudian memutuskan tautannya - file tersebut akan terus ada hingga Anda menutupnya - dan kemudian membuat file baru dengan nama yang sama dan menulis data yang di-gzip ke situ. Namun saya tidak tahu cara yang jelas untuk memaksa bash menggunakan itu, dan bahkan jika saya melakukannya, jawaban saya tetap akan:
Jangan lakukan itu.
Jika
gzip
gagal karena alasan apa pun, atau masalah apa pun terjadi, seperti Anda kehabisan ruang saat gzipping (karena proses lain sedang menulis, atau hasil gzip lebih besar dari input - yang terjadi untuk data acak - dll.), Anda baru saja kehilangan file Anda . Selamat!Buat file terpisah dan
mv
sukses. Itu adalah metode paling sederhana, mudah dimengerti, dan paling dapat diandalkan yang pernah Anda temukan.sumber
gzip example.txt && mv example.txt.gz example.txt
mv
sukses." dapat dibuat lebih elegan? Saya hanya mencoba mengusulkan agar jawaban frostschutz ditambah dengan contoh spesifik. Jikamv
bisa digunakan lebih elegan dari yang saya kira, tolong beri contoh.Saya memiliki masalah yang sama, sebagai bagian dari penyebaran CI ke AWS S3.
Ini adalah apa yang saya lakukan untuk secara gzip mencari direktori (di tempat) tanpa
.gz
akhiran:Tampaknya cukup bersih untukku. Tapi ya sepertinya Anda perlu
mv
di sana di suatu tempat.Jika Anda menggunakan,
grunt
Anda bisa melihatnyagrunt-contrib-compress
. Beberapagrunt
alat khusus untuk digunakan ke S3 akan menangani gzip juga untuk Anda.sumber
find . -type ...
janganfind.
tambahkan spasi :)-S
ekstensi yang Anda inginkanakan menghasilkan dog.txt_2015_11
ketika Anda unzip, Anda harus menentukan ekstensi.
Di unix gunakan perintah file untuk menentukan jenis file apa yang Anda miliki, ekstensi itu menyesatkan, atau sering hilang.
sumber
Saya tidak berpikir membuat file gzip tanpa ekstensi benar-benar hal yang tepat untuk dilakukan.
IMHo Anda harus mengkonfigurasi server web Anda untuk membaca file .gz. Anda mungkin sudah memiliki aturan seperti ini:
Anda hanya perlu menambahkan aturan penulisan ulang nama file yang diminta untuk menambahkan ".gz" (sebenarnya, Anda harus memeriksa apakah file tersebut ada, sama seperti Anda harus memverifikasi bahwa klien memang membuat daftar gzip pada header Terima-Pengkodean)
sumber
Anda dapat mencoba s3_website untuk ini.
Saya tidak suka fakta itu ditulis dalam scala dan ruby dan itu membutuhkan JVM. Saya juga tidak suka asumsi yang dibuatnya (terutama fakta bahwa ia menghapus file tambahan dari bucket) tetapi itu akan berfungsi jika Anda baik-baik saja dengan itu.
Saya berencana untuk menulis alat seperti itu sendiri yang tidak memiliki batasan ini, tetap disini.
sumber
Ini sebenarnya bukan sesuatu yang harus Anda lakukan, terutama karena ketika mentransfer file ini ke sistem atau orang lain, itu mungkin akan membingungkan mereka dan tidak menemukannya sebagai file terkompresi.
Jika Anda tidak ingin menggunakan akhiran apa pun, maka GNU tidak baik untuk Anda, karena
gzip -S ""
akan mengembalikan agzip: invalid suffix ''
.Namun, Anda selalu dapat mengirim sesuatu seperti
gzip -S " "
(ruang kosong), dan itu akan ditampilkan seperti ini:Setelah itu, jika Anda ingin mendekompresnya, Anda harus melakukan sesuatu seperti
gunzip -c testfile\
(tanpa menentukan akhiran), atau bahkan dengan-f
flag.Saya dengan tulus berpikir bahwa menambahkan
mv
perintah dengan&&
tidak akan membuat banyak masalah pada kode Anda. Ngomong-ngomong, dan seperti yang dikatakan @frostschutz, bukan ide yang bagus untuk melakukan ini.sumber