Apakah ada cara untuk memaksa gzip untuk tidak menimpa file pada konflik?

17

Saya sedang menulis skrip tempat saya melakukan gzipping file.

Ada kemungkinan saya dapat zip file, membuat file dengan nama yang sama, dan mencoba untuk gzip ini juga, misalnya

$ 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

Dengan menggunakan gzip --force, saya bisa memaksa gzip untuk menimpa foo.gz, tetapi dalam kasus ini, saya berpikir bahwa ada peluang bagus bahwa saya mungkin kehilangan data jika saya menimpa foo.gz. Tampaknya tidak ada saklar baris perintah untuk memaksa gzip meninggalkan .gzfile sendirian ... versi non-interaktif dari menekan 'n' saat diminta.

Saya mencoba gzip --noforcedan gzip --no-force, berharap ini bisa mengikuti standar opsi GNU, tetapi tidak ada yang berhasil.

Apakah ada penyelesaian langsung untuk ini?

Edit:

Ternyata inilah saatnya membayar halaman informasi daripada halaman manual.

Dari halaman info:

`--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.

Halaman manual tidak ada teks dan saat tidak berjalan di latar belakang

Saat berjalan di latar belakang, gzip tidak akan meminta, dan tidak akan menimpa kecuali -fopsi dipanggil.

Barton Chittenden
sumber
3
Saya tidak yakin bagaimana gzip memeriksa latar belakangnya, tetapi menambahkan '&' di bash pada sistem yang sedang saya kerjakan tidak melakukannya. Berada di sisi lain dari pipa tampaknya bekerja, jadi, alih-alih: find ./ ! -name "*gz" -exec gzip {} \; & ini bekerja: find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip laporan gzip: gzip: ./2012-July.txt.gz already exists; not overwritten
Bill McGonigle
1
@BillMcGonigle Komentar Anda harus jawaban THE!
Rockallite

Jawaban:

9

Saya sadar bahwa cara terbaik untuk menghindari efek yang tidak diinginkan adalah dengan tidak meminta program untuk melakukan efek yang tidak diinginkan. Artinya, jangan katakan itu untuk mengompres file jika file tersebut sudah ada dalam bentuk terkompresi.

misalnya:

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

atau lebih pendek (jalankan truejika ada file.gz, kompres file lain)

[ -f "$file.gz" ] && echo "skipping $file" || gzip "$file"    
Ярослав Рахматуллин
sumber
Sayangnya, ini sedang dijalankan sebagai perintah sistem di dalam skrip perl (cerita panjang tentang mengapa kita tidak menggunakan sesuatu seperti IO :: Compress :: Gzip, percayalah, saya sudah memikirkannya). Perintah kompresi itu sendiri disimpan dalam file konfigurasi. Perintah terakhir Anda terlihat dekat dengan apa yang saya butuhkan, tetapi saya pikir saya telah menemukan sesuatu yang sesuai dengan kebutuhan saya sedikit lebih baik. Saya akan menerima jawaban Anda, karena ini adalah solusi umum yang lebih baik daripada saya, tetapi lihat di bawah untuk apa yang sebenarnya akan saya gunakan.
Barton Chittenden
Anda dapat menyodok file di Perl ...
Ярослав Рахматуллин
1
Saya tidak jelas apa yang Anda maksud dengan poke a file.
Barton Chittenden
Kurangnya penggunaan asosiasi / gambar dalam komunikasi sehari-hari dalam Bahasa Inggris Amerika mengejutkan saya setiap saat :) Biarkan saya coba dan jelaskan. Sulap gambar seorang anak yang menyodok gagak mati dengan tongkat untuk melihat apakah masih hidup atau tidak. Poking digunakan untuk menyelidiki atribut di sini. Demikian pula, menusuk file berarti memeriksa sesuatu tentang hal itu, seperti jika ada. Bagaimanapun, saya merasa tindakan menusuk setidaknya harus berarti "mencapai kontak dengan objek eksterior" , dan itu sudah cukup untuk mengatakan "dapatkan beberapa informasi tentang file" dengan gambar, bukannya mengeja itu.
Ярослав Рахматуллин
"poke" sering merupakan slang peretas untuk menetapkan lokasi memori. Lihat: en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Bill McGonigle
12

Hal terdekat yang dapat saya temukan untuk satu perintah adalah sebagai berikut:

yes n | gzip archive/foo

The yescetakan perintah ydiikuti dengan linefeed untuk stdout sampai menerima sinyal. Jika ada argumen, itu akan mencetak itu alih-alih y. Dalam hal ini, ia mencetak nsampai gzip keluar, sehingga menutup pipa.

Ini setara dengan memasukkan nberulang kali pada keyboard; ini akan secara otomatis menjawab pertanyaangzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

Saya umum, saya pikir lebih baik tidak mencoba untuk mengompres file jika file gzipped yang sesuai ada; solusi saya lebih berisik, tetapi cocok dengan kebutuhan khusus saya untuk penggantian drop-in untuk gzipperintah, duduk di file konfigurasi.

Barton Chittenden
sumber
1
gangguan lain dengan ini adalah bahwa gzipkeluar2
Steven Penny