15

我有以下我想做的事情:

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=-

即,排除一大堆东西,只看六个子目录深度,然后一旦修剪完成,剩下的就“焦油”了。

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

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

4

6 回答 6

24

查找标志的组合-print,然后--files-from在“tar”命令上为我工作。在我的情况下,我需要压缩 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 -
于 2014-03-13T16:25:33.667 回答
6

我记得做了类似下面一行的事情来“tar”一堆文件。我对我想要分组的文件很明确,所以我运行了这样的东西:

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

在您的情况下,我想知道您为什么在 -print 似乎再次包含所有内容之前执行“-o”。

于 2012-08-13T09:44:17.610 回答
4

如果您的“查找”正在返回目录,那么这些目录将被传递给“tar”,并且将包含完整的内容,而不管您的“查找”命令中的排除项如何。

因此,我认为您需要在“查找”中包含“-type f”。

于 2013-03-20T16:48:07.160 回答
0

我使用了前两种方法的组合。为了备份一天的工作,我这样做:

rm -rf new.tgz; find . -type f -mtime 0 | xargs tar cvf new.tgz;
于 2014-11-07T20:02:45.397 回答
0

files-from没有选项的情况下使用是使它对我有用的唯一方法。所有其他选项包括目录中的所有文件,而不是我生成的列表。

这是我的解决方案:

find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from
于 2017-07-17T11:25:23.403 回答
0

这适用于我,其中 ARG 可以是任何名称 var

寻找 。-name "*.tar.gz" -print | xargs -I ARG 焦油 -xvzf ARG

于 2021-03-25T13:23:41.370 回答