Gzip'i çakışmadaki dosyaların üzerine yazmamaya zorlamanın bir yolu var mı?


17

Ben dosyaları gzipping bir komut dosyası yazıyorum.

Bir dosyayı sıkıştırıp aynı adda bir dosya oluşturabilirim ve bunu da gzip etmeye çalışabilirim, örn.

$ ls -l archive/
total 4
-rw-r--r-- 1 xyzzy xyzzy  0 Apr 16 11:29 foo
-rw-r--r-- 1 xyzzy xyzzy 24 Apr 16 11:29 foo.gz

$ gzip archive/foo
gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)? n   
    not overwritten

Kullanarak gzip --forcegzip'i üzerine yazmaya zorlayabilirim foo.gz, ancak bu durumda, üzerine yazarsam veri kaybetme şansımın yüksek olduğunu düşünüyorum foo.gz. Gzip'i .gzdosyaları yalnız bırakmaya zorlayan bir komut satırı anahtarı yok gibi görünüyor ... istemde 'n' tuşuna basmanın etkileşimli olmayan bir sürümü.

Bunların GNU seçenekleri standardını izleyebileceğini umarak denedim gzip --noforceve gzip --no-forcehiçbiri işe yaramadı.

Bunun için basit bir çözüm var mı?

Düzenle:

Bunun, man sayfasını değil, bilgi sayfasını okumak için ödediği zamanlardan biri olduğu ortaya çıkıyor.

Bilgi sayfasından:

`--force'
`-f'
     Force compression or decompression even if the file has multiple
     links or the corresponding file already exists, or if the
     compressed data is read from or written to a terminal.  If the
     input data is not in a format recognized by `gzip', and if the
     option `--stdout' is also given, copy the input data without
     change to the standard output: let `zcat' behave as `cat'.  If
     `-f' is not given, and when not running in the background, `gzip'
     prompts to verify whether an existing file should be overwritten.

Kılavuz sayfasında metin eksikti ve arka planda çalışmadığında

Arka planda çalışırken, gzip istemez ve -fseçenek çağrılmadığı sürece üzerine yazılmaz .


3
Gzip'in arka plan olup olmadığını nasıl kontrol ettiğinden emin değilim, ancak üzerinde çalıştığım sistemde bash'a '&' eklemek işe yaramıyor. Bir borunun diğer tarafında olmak işe yarıyor gibi görünüyor, bunun yerine: find ./ ! -name "*gz" -exec gzip {} \; & bu işe yarıyor: find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip gzip raporları: gzip: ./2012-July.txt.gz already exists; not overwritten
Bill McGonigle

1
@BillMcGonigle Yorumunuz cevap olmalı!
Rockallite

Yanıtlar:


9

Bu istenmeyen etkiyi önlemenin en iyi yolu olduğunu kafama dank etti etmiştir değildir istenmeyen etkiyi gerçekleştirmek için programı isteyin. Yani, dosya zaten sıkıştırılmış biçimde mevcutsa, bir dosyayı sıkıştırmasını söylemeyin.

Örneğin:

if [ ! -f "$file.gz" ]; then 
    gzip "$file"; 
else 
    echo "skipping $file"
fi

veya daha kısa ( truebir dosya varsa çalıştırın. gz, dosyayı sıkıştırın aksi halde)

[ -f "$file.gz" ] && echo "skipping $file" || gzip "$file"    

Ne yazık ki, bu bir perl betiği içinde bir sistem komutu olarak çalıştırılıyor (neden IO :: Compress :: Gzip gibi bir şey kullanmadığımızla ilgili uzun hikaye), güven bana, bunu düşündüm. Sıkıştırma komutunun kendisi bir yapılandırma dosyasında saklanır. İkinci komutunuz ihtiyaç duyduğum şeye yakın görünüyor, ancak sanırım ihtiyaçlarıma biraz daha iyi uyacak bir şey buldum. Cevabınızı kabul edeceğim, çünkü bu benimkinden daha iyi bir genel çözüm, ama aslında ne kullanacağım için aşağıya bakın.
Barton Chittenden

Perl'de bir dosya poke edebilirsiniz ...
Ярослав Рахматуллин

1
Ne demek istediğini net değilim poke a file.
Barton Chittenden

Amerikan İngilizcesinde günlük iletişimde dernek / görüntü kullanım eksikliği her seferinde beni şaşırtıyor :) Açıklamaya çalışayım. Hayatta olup olmadığını görmek için ölü bir karga sopayla bir çocuğun görüntüsünü tasarlayın. Poking burada nitelikleri araştırmak için kullanılır . Benzer şekilde, bir dosyayı alay gibi, bu konuda bir şeyler kontrol etmek anlamına geleceğini eğer hepsi şu anda olduğunu. Her halükarda, ben hissediyorum alay eylemi çok az ortalama gerektiğini de "bir dış nesne ile temas ulaşmak" ve bu demek yeterli değildir "Bir dosya hakkında bilgi almak" yerine harf harf arasında bir görüntüyle.
Ярослав Рахматуллин

"poke" genellikle bir bellek konumu ayarlamak için hacker argo. Bakınız: en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Bill McGonigle

12

Tek bir komuta bulabildiğim en yakın şey şudur:

yes n | gzip archive/foo

yesKomut baskılar yo sinyal alana kadar bir besleme ile takip stdout'a. Bir argümanı varsa, bunun yerine yazdırır y. Bu durumda, ngzip çıkana kadar yazdırır , böylece boruyu kapatır.

Bu, nklavyeye tekrar tekrar girmenin karşılığıdır ; bu soruya otomatik olarak cevap verecektirgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

Genel olarak, ilgili gzip dosyası varsa dosyaları sıkıştırmaya çalışmamak daha iyi olduğunu düşünüyorum; benim çözümüm daha gürültülü, ama gzipbir yapılandırma dosyasında oturan komutun yerine geçmesi için özel ihtiyaçlarıma uyuyor .


1
Bu başka sıkıntı olduğunu gzipçıkışlar2
Steven Penny
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.