我有以下我想做的事:
find . -maxdepth 6 ( -name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra ) -prune -o -print| tar cvf somefile.tar --files-from=-
即排除了很多东西,只看到6个子深度,然后一旦完成修剪,就把剩下的东西砸掉。
不难。管道(|)之前的位工作100%。如果我排除了焦油,那么我就会得到我所追求的(到屏幕上)。但是,一旦我包含了管道和焦油,它就会包含所有东西,包括我刚刚在查找中排除的所有东西。
我尝试了许多不同的迭代:
-print0 | xargs -0 tar rvf somefile.tar
-print0 | xargs -0 tar rvf somefile.tar --null --files-from = -
-print0 | tar cvf somefile.tar --null -T -
那么我做错了什么?我以前做过这个;但现在它只是给了我白发。
答案 0 :(得分:15)
对我来说有用的是find的-print标志,然后是tar命令的--files-from。在我的情况下,我需要记录5000多个日志文件,但只使用xargs只在结果文件中给了我500个文件。
find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from -
你有“--files-from = - ”,当你只想要“--files-from - ”然后我认为你需要一个 - 在cvf前面,如下所示。
find . -maxdepth 6 ( -name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra ) -prune -o -print| tar -cvf somefile.tar.gz --files-from -
答案 1 :(得分:5)
我记得像下面这样做一些tar文件。我特别关于我想要分组的文件,所以我运行了类似的东西
find . -name "*.xyz" | xargs tar cvf xyz.tar;
在你的情况下,我想知道为什么你在-print之前做了“-o”似乎又包括了所有内容
答案 2 :(得分:3)
如果您的find返回目录,那么这些目录将被传递给tar,并且无论您在find命令中的排除项如何,都将包含完整内容。
所以,我认为你需要在find中包含一个“-type f”。
答案 3 :(得分:0)
我使用上述两种方法的组合 - 备份一天的工作我这样做:rm -rf new.tgz;找 。 -type f -mtime 0 | xargs tar cvf new.tgz;
答案 4 :(得分:0)
在没有选项的情况下使用files-from是唯一让它适合我的方法。所有其他选项包括目录中的所有文件,而不是我生成的列表。
这是我的解决方案:
find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from
答案 5 :(得分:0)
这对我有用,其中 ARG 可以是任何名称 var
找到。 -name "*.tar.gz" -print | xargs -I ARG tar -xvzf ARG