Nasıl gzip'e orijinal dosyayı tutmasını söylersin?


210

Orijinal dosyayı tutarken gzip komut satırı aracını kullanarak bir metin dosyasını sıkıştırmak istiyorum . Varsayılan olarak aşağıdaki komutu çalıştırarak

gzip file.txt

bu dosyayı değiştirip yeniden adlandırmaya neden olur file.txt.gz. Bu davranış yerine , mevcut olanın yanı sıra bu yeni sıkıştırılmış dosyaya sahip olmak istiyorum file.txt. Şimdilik bunu yapmak için aşağıdaki komutu kullanıyorum

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

Çalışıyor ama neden bu kadar yaygın bir iş yapmak için kolay bir çözüm olmadığını merak ediyorum? Belki bunu yaparken seçeneği özledim?


3
Bunun nedeni, gzip'in verilen dosyayı sıkıştırması ve yeni dosya oluşturmasıdır. Sıkıştırma, orijinal dosyayı sıkmak ve yenisiyle değiştirmek anlamına gelir. "-C" seçeneğiniz açıkça gzip'e başka bir adla kaydetmesini söylüyor. Bu yüzden işe yarıyor
— SHW

@SHW Yorumunuzu alamadım ...?
— Manuel Selva

@ ManuelSelva bir kez orijinal dosya sıkıştırıldığında, artık gerekli değildir, sanırım tasarımdı.
— Daisy

2
Gzip / gunzip bunu neden varsayılan olarak ne zaman başka hiçbir unix aracı yapar bu beni aşar.
— Mateen Ulhaq

Yanıtlar:


247

GNU gzip1.6 veya üzeri, FreeBSD ve türevleri veya NetBSD'nin son sürümleri için don_cristi'nin cevabına bakınız .

Herhangi bir sürümde, kabuk yönlendirmelerini aşağıdaki gibi kullanabilirsiniz:

gzip < file > file.gz

Herhangi bir argüman verilmediğinde, gzipstandart girişini okur, sıkıştırır ve sıkıştırılmış sürümü standart çıkışına yazar. Bir bonus olarak, kabuk yönlendirmelerini kullanırken, "--help"ya da çağrılan dosyalar için endişelenmenize gerek yoktur "-"(ikincisi hala problem için gzip -c --).

Diğer bir yararı gzip -c file > file.gz, fileaçılamazsa komutun boş yaratmadan file.gz(veya varolanın üzerine yazmadan file.gz) ve hiç çalışmayacak şekilde başarısız olmasıdır gzip.

Buna kıyasla anlamlı bir fark gzip -k, filemeta verilerini (mülkiyet, izinler, değişiklik zamanı, sıkıştırılmamış dosyanın adı) 'na kopyalamaya çalışmak olmayacağıdır file.gz.

Ayrıca file.gzönceden varsa noclobber, kabuğunuzdaki seçeneği açmadığınız sürece sessizce geçersiz kılar ( set -o noclobberörneğin POSIX kabuklarında).


4
Şimdi bu OP'nin sorusunun özelliklerini ele alıyor ve "gzip'e orijinal dosyayı nasıl saklayacağımı" genel sorusuna cevap veriyor. Çok kullanışlı ve daha kullanışlı -c.
— codewaggle

8
<Ve> öğelerinin gerçekte komuta yazılmasının ve dosya adı için bir yer tutucuyu temsil etmemesi gerektiğini unutmayın
— Gaurav Gupta

Nedir -kseçenek? Kılavuzun sayfalarında bulunamadı , örneğin buradaki linux.die.net/man/1/gzip . Ayrıca, gzip varsayılan olarak dosyanın meta verilerini de kopyalar gibi görünüyor.
— flow2k

1
@ flow2k, bu don_cristi'nin cevabına bağlantı.
— Stéphane Chazelas

ah, makaklarımda görüyorum ama ne yazık ki RHEL ve Ubuntu'da değil. Teşekkürler.
— flow2k

138

Son zamanlarda yayınlanan (Haziran 2013), "xke, lzip ve bzip2 gibi araçlarla tutarlılık için --keep (-k) seçeneğini kabul eder. Bu seçenek ile gzip, sıkıştırırken veya sıkıştırmayı açarken adlandırılmış giriş dosyalarını artık kaldırmaz" .gzip-1.6

Man sayfasından alıntı:

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

Böylece, orijinal dosyayı 1.6kullanmak -kveya --keepsaklamak için kullanabilirsiniz :

gzip -k -- "$file"

(eğer bu işe yaramazsa unutmayın $fileolduğu -hangi ( gzipanlam olarak yorumladığı Stdin yerine denilen gerçek dosyasının -bu durumda, bunu değiştirmek zorunda) ./-)

Bu seçenek ilk önce FreeBSD uygulamasındagzip (2007 yılında FreeBSD 7.0'da) tutarlılığı sağlanmıştır bzip2. Bu gzip, gzipNetBSD'nin GNU'sunun yeniden yazılmasına dayanıyor . Bu -kseçenek nihayetinde 2010 yılında NetBSD'ye geri döndü .


10
Tanrım. RHEL6 sadece bazda 1.3.12 fermuarla geliyor ...
— Nicholas Tolley Cottrell

Bu Mac / OS X'de çalışır :) (BSD'dir)
— paul

Artık> = 1.6 kullanmayan birçok standart dağıtım var mı? Cevabın güncellenmesi gerekip gerekmediğini merak ediyorum
— MichaelChirico

Ne için? Bence gzip -k "dosya" düzgün çalışıyor.
— notilas,


30

Belgelerde, dosyanın bir kopyasını yaratma seçeneğinin olmadığı görülüyor.

Bir kabuk işlevi tanımlayabilirsiniz

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

ve sonra

gzipkeep file.txt

2
Dosya ise -, olarak çağırmanız gerektiğini unutmayın gzipkeep ./-.
— Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.