4

在 UBUNTU 和 CENTOS 中。

我有一些文件要根据它们的内容进行 tar。

$ grep -rl "123.45" .

以这种格式返回大约 10 个文件的列表:

./somefolder/someotherfolder/somefile.txt
./anotherfolder/anotherfile.txt

ETC...

我想把它们全部 tar.gz。

我试过了:

$ grep -rl "123.45" . | tar -czf files.tar.gz

不工作。这就是我在这里的原因。有任何想法吗?谢谢。

刚刚尝试过,它在 Ubuntu 中工作,但在 CentOS 中我得到“tar:02:无法统计:没有这样的文件或目录”。

$ tar -czf test.tar.gz `grep -rl "123.45" .`

如果其他人有更好的方法,请告诉我。至少,以上一个在 Ubuntu 中效果很好。

4

3 回答 3

9

像这样:

 ... | tar -T - -czf files.tar.gz

"-T -" 使 tar 从标准输入读取文件名。第二个减号代表标准输入。——</p>

于 2012-12-22T20:07:52.390 回答
1
grep -rl "123.45" . | xargs tar -czf files.tar.gz
于 2012-12-23T19:10:52.977 回答
0

Tar 希望被告知要处理哪些文件,而不是通过标准输入给出文件的名称。

但是它确实有一个-T/--files-from选项。所以我建议使用它。将所选文件的列表输出到临时文件,然后 tar 读取该文件,如下所示:

T=$(mktemp)
grep -rl "123.45" . > $T
tar cfz files.tar.gz -T $T
rm -f $T

如果你愿意,你也可以使用 shell 扩展来做到这一点:

tar cfz files.tar.gz -- $(grep -rl "123.45" .)

但是,如果您有太多文件或任何文件有奇怪的名称(如空格等),这将失败。

于 2012-12-22T20:07:33.950 回答