下面是我的 find 命令,它搜索并将搜索到的文件结果转储到/tmp/findall.log
find /app/test -type d \( -name logs -o -name 'logs*' -o -name 'tmp*' \) -prune -o -print | tee /tmp/findall.log
我可以在查找结果中看到阶段文件夹,如下所示:
grep stage /tmp/findall.log | more
/app/test/Server2/stage_02032020
/app/test/Server2/stage_02032020/Buyers
/app/test/Server2/stage_02032020/Buyers/BuyersQuote.xlsx
/app/test/Server2/stage_02032020/Buyers/xml
find
然后,我决定使用以下命令压缩结果中找到的文件。
find /app/test -type d \( -name logs -o -name 'logs*' -o -name 'tmp*' \) -prune -o -print0 | xargs -0 tar -cvf /app/test_Backup.tar
但是,我的 tar 文件没有阶段文件夹,如下所示的查找结果所示。
tar -tvf test_Backup.tar | grep stage
No results Found.
您能否建议为什么 tar 文件中缺少查找结果中的文件?
答案1
可能是“发现”它传递了一个空字符串或类似的东西,您可以使用“--no-run-if-empty”进行故障排除,然后不应创建 tar 。
find /app/test -type d \( -name logs -o -name 'logs*' -o -name 'tmp*' \) -prune -o -print0 | xargs --no-run-if-empty -0 tar -cvf /app/test_Backup.tar
顺便说一句,你的代码在我的树莓派上运行。 GNU bash,版本 4.4.19(1)-release (armv7hl-redhat-linux-gnu)
答案2
如果你的find
命令正在生成许多路径名,那么xargs
很可能会执行tar
多次。每次执行tar
都会覆盖上次执行时创建的存档tar
,因此最终您会留下一个由最后一批find
找到的文件组成的存档。
假设您在 AIX 上(正如您将上一个问题标记为艾克斯),您想要做的可能是将路径写入文件,然后将该文件与tar -L listfile
(-L
选项tar
在 AIX 上给出一个包含要归档的路径名的列表文件)。
find ...as you had... >listfile
tar -cf archive.tar -L listfile
由于我无法访问 AIX 系统,因此我无法对此进行测试。