Bagaimana cara memberitahu gzip untuk menyimpan file asli?

210

Saya ingin mengompres file teks menggunakan alat baris perintah gzip sambil menyimpan file asli. Secara default menjalankan perintah berikut

gzip file.txt

hasil dalam memodifikasi file ini dan mengganti nama file itu file.txt.gz. alih-alih perilaku ini saya ingin memiliki file terkompresi baru ini selain yang sudah ada file.txt. Untuk saat ini saya menggunakan perintah berikut untuk melakukan itu

gzip -c file.txt > file.txt.gz

Ini bekerja tetapi saya bertanya-tanya mengapa tidak ada solusi yang lebih mudah untuk melakukan tugas bersama seperti itu? Mungkin saya melewatkan opsi melakukan itu?

Manuel Selva
sumber
3
Ini karena, gzip memampatkan file yang diberikan dan membuat file baru. Kompresi berarti memeras file asli dan menggantinya dengan yang baru. Opsi "-c" Anda secara eksplisit memberitahu gzip untuk menyimpannya dengan nama lain. Itu sebabnya ia bekerja
SHW
@SHW Saya tidak mendapatkan komentar Anda ...?
Manuel Selva
@ ManuelSelva setelah file asli dikompresi, itu tidak diperlukan lagi, saya kira itu desainnya.
daisy
2
Mengapa gzip / gunzip melakukan ini secara default ketika tidak ada alat unix lain melakukan ini di luar saya.
Mateen Ulhaq

Jawaban:

247

Untuk GNU gzip1.6 atau lebih baru, FreeBSD dan turunannya atau versi NetBSD terbaru, lihat jawaban don_cristi .

Dengan versi apa pun, Anda dapat menggunakan pengalihan shell seperti pada:

gzip < file > file.gz

Ketika tidak diberi argumen, gzipbaca input standarnya, kompres dan tulis versi terkompresi ke output standarnya. Sebagai bonus, saat menggunakan pengalihan shell, Anda tidak perlu khawatir tentang file yang dipanggil "--help"atau "-"(yang terakhir masih menjadi masalah bagi gzip -c --).

Manfaat lain gzip -c file > file.gzadalah bahwa jika filetidak dapat dibuka, perintah akan gagal tanpa membuat yang kosong file.gz(atau menimpa yang sudah ada file.gz) dan tanpa menjalankan gzipsama sekali.

Perbedaan yang signifikan dibandingkan dengan gzip -kmeskipun adalah bahwa tidak akan ada upaya menyalin filemetadata (kepemilikan, izin, waktu modifikasi, nama file yang tidak terkompresi) ke file.gz.

Juga jika file.gzsudah ada, itu akan diam-diam menimpanya kecuali Anda telah mengaktifkan noclobberopsi di shell Anda ( set -o noclobbermisalnya dengan shell POSIX).

Stéphane Chazelas
sumber
4
Sekarang ini membahas secara spesifik pertanyaan OP dan menjawab pertanyaan umum "Bagaimana cara memberitahu gzip untuk menyimpan file asli". Sangat berguna dan lebih bermanfaat daripada -c.
codewaggle
8
Perhatikan bahwa <dan> sebenarnya harus diketik ke dalam perintah dan tidak mewakili pengganti untuk nama file
Gaurav Gupta
Apa -kpilihannya? Tidak dapat menemukannya di halaman manual, mis. Versi ini di sini linux.die.net/man/1/gzip . Juga, sepertinya gzip menyalin metadata file secara default.
flow2k
1
@ flow2k, itu tautan ke jawaban don_cristi.
Stéphane Chazelas
ah, saya melihatnya di macos saya tapi sayang sekali tidak di RHEL atau Ubuntu. Terima kasih.
flow2k
138

Perhatikan bahwa baru-baru ini (Juni 2013) dirilis "menerima opsi --keep (-k), untuk konsistensi dengan alat-alat seperti xz, lzip dan bzip2. Dengan opsi ini, gzip tidak lagi menghapus file input bernama ketika mengompresi atau mendekompresi" .gzip-1.6

Kutipan dari halaman manual:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

Jadi, 1.6Anda dapat menggunakan -katau --keepmenyimpan file asli:

gzip -k -- "$file"

(perhatikan bahwa itu tidak berfungsi jika $fileis -(yang gzipmengartikan sebagai stdin alih-alih file yang sebenarnya disebut -), dalam hal ini, Anda harus mengubahnya ke ./-)

Opsi itu pertama kali diperkenalkan dalam implementasi FreeBSDgzip (dalam FreeBSD 7.0 pada 2007) untuk konsistensi dengan bzip2. Itu gzipdidasarkan pada penulisan ulang GNU gzipoleh NetBSD. The -kpilihan akhirnya berhasil kembali ke NetBSD pada tahun 2010 .

don_crissti
sumber
10
Ya ampun. RHEL6 hanya dilengkapi dengan zip 1.3.12 di pangkalan ...
Nicholas Tolley Cottrell
Ini berfungsi pada Mac / OS X :) (yang merupakan BSD)
paul
Apakah ada banyak distro standar yang tidak menggunakan> = 1.6 lagi? Ingin tahu jika jawaban perlu diupdate
MichaelChirico
Untuk apa "-"? Saya pikir gzip -k "file" berfungsi dengan baik.
notilas
3
@notilas lihat unix.stackexchange.com/q/11376/22142
don_crissti
30

Dari dokumentasi tampaknya tidak ada opsi untuk membuat salinan file.

Anda dapat mendefinisikan fungsi shell

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

lalu

gzipkeep file.txt
Matteo
sumber
2
Perhatikan bahwa jika file tersebut -, Anda harus menyebutnya sebagai gzipkeep ./-.
Stéphane Chazelas