使用grep -lr输出将文件添加到tar

在UBUNTU和CENTOS。

我有一些文件,我想根据他们的内容进行焦油。

$ grep -rl "123.45" . 

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

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

等等…

我想tar.gz所有的人。

我试过了:

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

不起作用。 这就是我来这里的原因。 有任何想法吗? 谢谢。

刚试过这个,而且它在Ubuntu下工作,但在CentOS中我得到“tar:02:不能stat:没有这样的文件或目录”。

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

如果有其他人有更好的办法,让我知道。 至less在Ubuntu上面的工作很好。

喜欢这个:

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

“-T – ”导致tar从标准输入读取文件名。 第二个减号代表stdin。 –

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

焦油想知道什么文件处理,而不是通过标准输入文件的名称。

它确实有一个-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" .) 

但是,如果你有太多的文件,或者如果有任何文件有奇怪的名字(如空间等),这将失败。