tar でファイルを複数回処理するには、 find -newer を使用します。

tar でファイルを複数回処理するには、 find -newer を使用します。

特定のfile()より新しいファイルアーカイブを生成するためにtar(1)を使用しようとしていますfileA。ただし、find(1)を使用してtarに渡すファイルのリストを取得すると、いくつかのファイルが複数回一覧表示されます。

$ touch fileA
$ mkdir test
$ touch test/{fileB,fileC}
$ tar -c -v $(find test -newer fileA) > test.tar
test/
test/fileC
test/fileB
test/fileC
test/fileB

xargs(1) を使用してファイルのリストを tar に渡すと、同様の動作が発生します。

$ find test -newer fileA | xargs tar -c -v > test.tar
test/
test/fileC
test/fileB
test/fileC
test/fileB

sort(1) および uniq(1) を使用して重複項目を削除しても機能しません。

$ find test -newer fileA | sort | uniq | xargs tar -c -v > test.tar
test/
test/fileC
test/fileB
test/fileB
test/fileC

fileAtarにそれぞれ2回以上更新されたファイルのみを含める方法はありますか?

編集する:私は特にtarのGNU拡張を含まないソリューションを探しています(たとえば、次のように使用できます)。タール吸収なし)。

答え1

find test -newer fileA

testディレクトリとその中にある個々のファイルが見つかったので(そしてその内容の両方)、およびをtar追加します。testtest/fileBtest/fileC

findこれを防ぐには、次の手順を実行します。

tar -c -v $(find test -type f -newer fileA) > test.tar

このようにコマンド置換を使用すると、問題が発生する可能性があります。例えばファイル名にはスペースまたはワイルドカードが含まれています。これを防ぐには、以下を使用してください。

find test -type f -newer fileA -print0 | tar -c -v --null -T- -f - > test.tar

(GNUfindtar)または

find test -type f -newer fileA -exec tar cvf - {} + > test.tar

(保存するファイルが多すぎないと仮定)。

答え2

次のように試すことができます。

tar --newer=fileA cvf test.tar test

関連情報