web-dev-qa-db-ja.com

競合時にファイルを上書きしないようにgzipを強制する方法はありますか?

ファイルをgzip圧縮するスクリプトを書いています。

ファイルをZipし、同じ名前のファイルを作成し、これもgzipしようとする可能性があります。

$ 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

gzip --forceを使用すると、gzipでfoo.gzを強制的に上書きできますが、この場合、foo.gzを上書きするとデータが失われる可能性が十分にあると思います。 gzipが.gzファイルをそのままにしておくように強制するコマンドラインスイッチはないようです...プロンプトで「n」を押す非インタラクティブバージョン。

私はgzip --noforcegzip --no-forceを試してみましたが、GNUオプションの標準に従うことを期待しましたが、どちらも機能しませんでした。

これに対する簡単な回避策はありますか?

編集:

これは、manページではなくinfoページを読むのにかかる時間の1つであることがわかりました。

情報ページから:

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

Manページにテキストがありませんそしてバックグラウンドで実行されていない場合

バックグラウンドで実行している場合、gzipはプロンプトを表示せず、-fオプションが呼び出されない限り上書きされません。

18

望ましくない影響を回避する最善の方法はnotにプログラムに望ましくない影響を実行するように依頼することであることが私にわかってきました。つまり、ファイルが既に圧縮形式で存在する場合は、ファイルを圧縮するように指示しないでください。

例えば:

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

以下(file.gzがある場合はtrueを実行し、それ以外の場合はファイルを圧縮します)

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

1つのコマンドに最も近いものは次のとおりです。

_yes n | gzip archive/foo
_

yesコマンドは、yを出力し、その後に信号を受信するまでstdoutに改行します。引数がある場合、yの代わりにそれを出力します。この場合、gzipが終了するまでnを出力し、パイプを閉じます。

これは、キーボードでnを繰り返し入力するのと同じです。これは自動的にgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?の質問に答えます

一般的に、対応するgzip圧縮ファイルが存在する場合は、ファイルを圧縮しない方がよいと思います。私の解決策はうるさいですが、それは、構成ファイルにあるgzipコマンドのドロップイン置換の私の特定のニーズに適合します。

13