2012-12-22 197 views
3

在UBUNTU和CENTOS中。使用grep -lr輸出將文件添加到tar

我有一些文件,我想基於它們的內容進行焦油。

$ 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:無法統計:沒有這樣的文件或目錄」。

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

如果其他人有更好的辦法,讓我知道。至少,上面的一個在Ubuntu中非常有用。

回答

0

Tar想知道要處理哪些文件,而不是通過stdin給出文件的名稱。

但它確實有-T/--files-from選項。所以我建議使用它。輸出所選的文件列表到一個臨時文件,然後焦油讀取,像這樣:

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" .) 

但是如果你有太多的文件或者任何文件有奇怪的名字(比如空格等),那就會失敗。

+0

我在問題的底部添加了什麼解決方案? –

+0

@ButtleButkus - back tick字符大部分與'$()'語法相同,它們都是命令擴展的形式。有一些小的差異,我個人比較喜歡'$()',但是你的解決方案適用於大多數情況。正如我上面提到的,如果太多文件匹配或者文件名中有空格的話,它將會失敗。 – JimP

+0

奇怪。 「我的」解決方案在Ubuntu上工作。但是我在CentOS中遇到錯誤。我從你的建議中得到同樣的錯誤。我試過'tar -czf files.tar.gz - $(grep -rl「123.45」。)' - 注意我加了點。但是,同樣的錯誤。 「不能統計:沒有這樣的文件或目錄」。 –

4

像這樣:

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

「-T - 」 導致焦油從stdin讀取的文件名。第二個減號代表stdin。 -

+0

你能解釋一下嗎?它的工作,但需要更多的信息來贏得upvote –

+1

@AlexandreReisRibeiro:「-T - 」導致tar從標準輸入讀取文件名。第二個減號代表stdin。 –

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

如果碰巧有足夠的文件與grep匹配,則'xargs'將調用tar兩次,第二次將覆蓋第一個創建的文件。 – JimP

+0

我試過了,在CentOS上得到了「無法統計:沒有這樣的文件或目錄」。 –