web-dev-qa-db-ja.com

パイプ内に存在しないファイルを除外するシェルコマンド

別のtar.gzの抽出によってオーバーライドされるもののバックアップtar.gzを生成するための優れた方法を探しています。

tar -ztf patch.tar.gz | grep -v "/$" | tar -T- -zcvf backup.tar.gz

これは完璧に機能します!ただし、新しいパッチ(patch.tar.gz)には、HDDにすでに存在するファイルが含まれるだけでなく、まだ存在しない新しいファイルが追加される場合があります。存在しないこれらのファイルはバックアップできず、2番目のtarはエラーを生成します。終了コードは2です。

tar:folder/file.txt:統計できません:そのようなファイルまたはディレクトリはありません
tar:以前のエラーによる失敗ステータスで終了します

ファイルの存在(stdin)をチェックし、stdoutに既存のファイルを送信するだけのシェルコマンドを探しています。存在しますか?私はこのようなものが必要になります:

tar -ztf patch.tar.gz | grep -v "/$" | filterfileexist | tar -T- -zcvf backup.tar.gz

シェルスクリプトではなく、1つのシェルコマンドが必要です。
[。

5
Fox

これにはPerlワンライナーを使用してみてください

お気に入り

cat filelist | Perl -ne 'chomp(); if (-e $_) {print "$_\n"}' | tar -T- -zcvf backup.tar.gz
3
Nik

ここにいくつかの選択肢があります。

tar -ztf patch.tar.gz | grep -v "/ $" | xargs -i sh -c'test -f {} && echo {} '| tar -T- -zcvf backup.tar.gz

または

tar -ztf patch.tar.gz | grep -v "/ $" | tar --ignore-failed-read -T- -zcvf backup.tar.gz

2番目の例は、存在しないファイル(Centos 6.5でテスト済み)のバックアップを試みた後、ステータス0で終了します。これにより、問題が回避されます。

3
John Auld