使用 find -newer 多次 tar 处理文件

使用 find -newer 多次 tar 处理文件

我正在尝试使用 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

有没有办法让 tar 仅包含每个更新超过fileA一次的文件?

编辑:我正在专门寻找一个不涉及 tar 的 GNU 扩展的解决方案(例如,它可以与无吸焦油)。

答案1

find test -newer fileA

找到test目录以及其中的各个文件,因此tar添加test(及其所有内容),然后test/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

相关内容