2012-03-12 6 views
1

圧縮されたtarファイルをアンパックする前に、上書きされるファイルをバックアップする最良の方法は何ですか?例えば簡単なロールバックのために解凍する前にtarアーカイブにリストアされたバックアップファイル

、含む入力アーカイブfiles.tar.gz与えられた:私たちは、

path/to/fileA.txt 
path/to/fileC.txt 

fileA.txtとfileC.txtが上書きされますのでう:

私たちが持っているファイルシステム上
path/to/fileA.txt 
path/to/fileB.txt 
path/to/fileC.txt 

と現在をfiles-backup.tar.gzが2つの元のファイルのみを含むようにしてください。

現在、私は手動でこれをやっています。もしうまくいかない場合は、粗いロールバック機構を持っています。いくつかの場所に少数のファイル以上のものがあると、これは苦痛になることがあります。

これをスクリプト化するか、tarコマンドの新しい隠しパラメータを知りたいでしょう。

UPDATE:これまでのところ、私が思い付くした最高のがある:あなたが持っていた何

tar ztf files.tar.gz | xargs tar zcvf /tmp/file-backup.tar.gz 

答えて

1

は良いスタートですが、注意すべき一つのことは、xargsのは、中に標準入力ラインを処理するということですグループ。 (それは人生の中でのすべての目的です:入力行の数を無制限にし、コマンド行引数のサブセットでコマンドを何度も実行する)files.tar.gzに膨大な数のファイルがある場合、xargsは実行します一度にそれらのサブセットにtar zcvf /tmp/file-backup.tar.gz!その結果、/tmp/file-backup.tar.gzにはファイルの最後のサブセットのみが含まれます!

パスをすべてpath/.../...と指定したので、すべてのパスが相対パスになると仮定します。

ここでは、より良い解決策は、(tar ...|while read...の使用に以下の「ノート」を参照)です。

 
(tar ztf files.tar.gz|while read f; do if [ -f "$f" -o -h "$f" ]; then echo "$f" ; fi; done)|tar Tcfz - /tmp/`date '+%Y%m%d_%H%M%S'`.file-backup.tar.gz 

tarコマンドがリストされ、その標準入力に提供されるファイルのリストを含む/tmp/yyyymmdd_hhmmss.file-backup.tar.gzという名前のファイルを生成ファイルとシンボリックリンクはfiles.tar.gzです。

  1. なく、実際にすべてのファイルをオフに保存するので、変更されたファイルだけをオフに保存します。

    最後に、あなたは簡単にhosuekeepingになるかもしれない代替案のカップルを検討する必要があります。

  2. または、tar/gzipファイルにファイルを保存する代わりに、ファイルの名前を変更してください。この方法は、あなたが最初にいくつかの異なる/tmp/yyyymmdd_hhmmss.file-backup.tar.gzのファイルに見に行くすることなく、新しいバージョン(複数可)を持っているファイルをすぐに参照してくださいね:
(TAG=`date '+%Y%m%d_%H%M%S'` ; tar ztf files.tar.gz|while read f; do if [ -f "$f" -o -h "$f" ]; then mv "$f" "$f.$TAG" ; fi; done)

注:tar ztf ...|while read fは、ファイル名が空白(単数または複数)を含有することを保証します問題は発生しません。自分の名前に空白(S)とfiles.tar.gz内のファイルがある場合、単純

for f in `tar ztf files.tar.gz`; do... 

は動作しません。

+0

うわー、答えてくれてありがとう。私はそれをテストします。はい、パスは相対パスであり、スクリプトはターゲットディレクトリで実行されます。一度にサブセットを実行するxargsについて知りませんでした。タールは以前のサブセットのみを持つことになります。私はスクリプトのprontoをアップグレードする方が良いでしょう。乾杯。 – zaf

関連する問題