找到xargs的和焦油

问题描述:

我有以下我想做的事:
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子目录深度,然后一旦修剪完成,焦油了休息。找到xargs的和焦油

不难。管道(|)之前的位工作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

我相信你需要周围的'* .tar.gz'报价,以避免它过得去'bash'传递给'之前扩大find' – drevicko 2013-05-06 01:07:02

我记得做了一些像下面一行到一堆tar文件。我具体谈谈我想组的文件,于是我就这样的事情

find . -name "*.xyz" | xargs tar cvf xyz.tar; 

在你的情况,我不知道为什么你似乎再次被包括一切

的-print之前做“-o”
+4

纠正我,如果我m错了,但我相信如果你有很多'find'输出的文件,'xargs'会多次运行'tar'与文件列表的子集。不幸的是,'-c'然后覆盖了以前的tar文件,你只能得到最后一个tar文件中的最后一个。 – drevicko 2013-05-06 00:44:56

+0

你可以试试。我成功地获得了我使用find进行搜索的7-8个文件的tar文件。这里发生的是,Find返回输出,并且xargs将它们馈送给生成单个tar文件的tar – rajshenoy 2013-06-10 14:35:42

+2

@jajshenoy 7-8文件可能不足以发现此问题。查看[本页]中的“最大命令长度”部分(http:// offbytwo。COM/2011/6月26日/东西 - 你 - didnt神秘约-xargs.html)。试试'echo | xargs --show-limits'来查看xargs正在使用的命令行缓冲区的大小 - 对我来说它是131072.这是相当大的,但是如果你有几千个文件,它会很快用完! – drevicko 2013-06-11 04:24:25

如果您发现正在返回目录,那么这些将被传递给tar,并且无论find命令中的排除项如何,都会包含完整内容。

所以,我认为你需要在find中包含一个“-type f”。

对我来说有效的是find -print标志的组合,然后是tar命令中的--files-from。在我的情况下,我需要tar超过5000个日志文件,但只是使用xargs只给了我500文件在生成的文件。

find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from - 

你有“--files-从= - ”,当你只是想“--files - 从 - ”然后我想你需要一个 - 在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 - 
+2

这是正确的解决方案,因为使用'--files-from-'避免了xargs限制(在@ rajshenoy示例的注释中明确指出)导致的不完整档案的问题。 – 2015-06-22 22:04:43

我使用上述两种方法的组合 - 备份一天的工作我这样做:rm -rf new.tgz;找 。 -type f -mtime 0 | xargs tar cvf new.tgz;

要使用没有选项的文件是唯一使它适用于我的文件。所有其他选项包括目录中的所有文件,而不是我生成的列表。

这是我的解决方案:

find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from