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


17

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

ファイルを圧縮し、同じ名前のファイルを作成し、これも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.

マニュアルページにテキストが欠落しており、バックグラウンドで実行されていない場合

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


3
gzipがどのようにバックグラウンド化されているかを確認することはできませんが、作業中のシステムでbashに「&」を追加しても実行されません。しかし、パイプの反対側にいることはうまくいくようですので、代わりに: find ./ ! -name "*gz" -exec gzip {} \; & これは動作します: find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip gzipレポート: gzip: ./2012-July.txt.gz already exists; not overwritten
ビルマクゴニグル

1
@BillMcGonigleあなたのコメントが答えになるはずです!
-Rockallite

回答:


9

これは、望ましくない影響を回避する最善の方法をしていることを私に夜が明けていない望ましくない効果を実行するためのプログラムをお願いします。つまり、ファイルが既に圧縮形式で存在している場合は、ファイルを圧縮するように指示しないでください。

例えば:

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

またはそれより短い(truefile.gzがある場合は実行し、そうでない場合はファイルを圧縮する)

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

残念ながら、これはperlスクリプト内でシステムコマンドとして実行されています(IO :: Compress :: Gzipのようなものを使用していない理由についての長い話、私を信じて、考えました)。圧縮コマンド自体は、構成ファイルに保存されます。後者のコマンドは私が必要とするものに近いように見えますが、私は自分のニーズに少し合ったものを見つけたと思います。それは私のものよりも一般的な解決策なので、あなたの答えを受け入れますが、実際に使用するものについては以下を参照してください。
バートンチッテンデン

あなたは... Perlでファイルを突くことができます
ЯрославРахматуллин

1
あなたの言う意味がはっきりしませんpoke a file
バートン

アメリカ英語での日常的なコミュニケーションでの連想/画像の使用の欠如は、毎回私を驚かせます:)試して説明させてください。死んだカラスを棒で突く子供のイメージを思い起こさせて、生きているかどうかを確認します。ここで属性調べるために、突くことが使用されます。同様に、ファイルを突くことなど、それについて何かを確認することを意味している場合、それはすべての存在です。いずれにせよ、私は感じ突きの行為は非常に少なくとも、平均すべき「外部物体との接触を達成」、およびそれが言うには十分である「ファイルに関するいくつかの情報取得」の代わりにそれを綴りの画像とを、。
ЯрославРахматуллин13年

「poke」は、メモリの場所を設定するためのハッカーの俗語です。参照:en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
ビルマクゴニグル

12

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

yes n | gzip archive/foo

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

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

一般的に、対応するgzip圧縮ファイルが存在する場合は、ファイルを圧縮しない方が良いと思います。私のソリューションはうるさいですがgzip、設定ファイルに置かれたコマンドのドロップイン置換の特定のニーズに適合します。


1
これに関する別の迷惑はgzip終了することです2
スティーブンペニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.