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