找到xargs和tar

zin*_*onk 11 tar find 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个深度的子目录,然后一旦修剪完毕,将其余部分用完.

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

那么我做错了什么?我以前做过这个; 但现在它只是给了我白发.

dav*_*ner 17

对我有用的是find的-print标志和tar命令的--files-from的组合.在我的情况下,我需要tar 5000个日志文件,但只使用xargs只给了我500个文件在结果文件中.

find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from -
Run Code Online (Sandbox Code Playgroud)

你有"--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 -
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,因为使用`--files-from -`可以避免xargs限制的问题(在@ rajshenoy示例的注释中清楚)导致存档不完整. (2认同)

raj*_*noy 5

我记得像下面这样做一些tar文件.我特别关注我想要分组的文件,所以我运行了这样的东西

find . -name "*.xyz" | xargs tar cvf xyz.tar;
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我想知道你为什么在-print之前做"-o"似乎又包括了一切

  • 如果我错了,请纠正我,但我相信如果你有很多文件由`find`输出,`xargs`将使用文件列表的子集多次运行`tar`.不幸的是,`-c`然后覆盖了以前的tar文件,你只得到最后一个tar文件中的最后一个. (4认同)
  • @jajshenoy 7-8文件可能还不足以发现这个问题.请查看[本页]中的"最大命令长度"部分(http://offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html).试试`echo | xargs --show-limits`看到xargs正在使用的命令行缓冲区的大小 - 对我来说它是131072.这个很大,但如果你有几千个文件,它会很快用完! (2认同)