特定の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
fileA
tarにそれぞれ2回以上更新されたファイルのみを含める方法はありますか?
編集する:私は特にtarのGNU拡張を含まないソリューションを探しています(たとえば、次のように使用できます)。タール吸収なし)。
答え1
find test -newer fileA
test
ディレクトリとその中にある個々のファイルが見つかったので(そしてその内容の両方)、およびをtar
追加します。test
test/fileB
test/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
(GNUfind
とtar
)または
find test -type f -newer fileA -exec tar cvf - {} + > test.tar
(保存するファイルが多すぎないと仮定)。
答え2
次のように試すことができます。
tar --newer=fileA cvf test.tar test