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.