ファイルを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 --noforce
とgzip --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
オプションが呼び出されない限り上書きされません。
望ましくない影響を回避する最善の方法は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
コマンドのドロップイン置換の私の特定のニーズに適合します。