2016-07-06 34 views
1

我有大量的目錄只有一個文件 - index.html - 在每個目錄中。我想使用grep在文件中查找模式,然後將目錄和文件一起復制到另一個目錄。grep文件的字符串和複製目錄到另一個目錄

複製文件的例子,我已經看到了,但我想複製目錄與文件到另一個目錄。

所以說下面是使用

grep -rl "string" source_dir 


d1/index.htmk 
d2/index.html 
d3/index.html 

... ... 一長串匹配與目錄中的文件列表。

現在將要複製到DEST-DIR所以dest_dir將看起來像

. 
.. 
d1/index.html 
d2/index.html 
d3/index.html 
... 
... 

TIA

+0

我假設你有第一個代碼塊的拼寫錯誤,其中'.htmk'實際上應該是'.html' –

回答

2

保留目錄結構,在直通模式下使用cpiocpio大約與tar一樣古老,曾經有更多的優勢,但它有一種滑入obscurity。我是新來的,並大多沿用古老的Linux Journal cpio guide建立這個命令:

mkdir dest_dir 
cd source_dir 
grep -Zlr "string" . |cpio -p0dmv ../dest_dir 

這通過管道符合條件的文件的null-terminated*列表直接進入cpio,其目的是採取以這種方式列出文件,然後存檔或複製(「傳遞」,-p)。我們在這裏做後者,保留目錄結構(-d)以及修改時間(-m)。我已將其設置爲詳細(-v),以便您可以觀察進度。如果您通過ssh進行連接,您可能不希望這樣做,因爲通過網絡呈現每個文件名可能會降低進程速度。

*關於空終止: 我用grep -Zlcpio -0解決包含換行符的文件名的問題(不這樣做!); grep -Zl列出了由空字符(路徑唯一無效字符)分隔的所有匹配文件,並且cpio -0預期以空終止的輸入(如xargs -0)。

 

我本來建議tar創建一個臨時歸檔和tar再次提取到新的位置。這使用xargs將文件列表轉換爲參數,因爲tar無法接受其他文件(或標準輸入,如cpio)的文件列表,但xargs將太長的命令拆分爲多個調用,而tar不能提取級聯輸出**

mkdir dest_dir 
cd source_dir 
grep -Zlr "string" . |xargs -0 tar -pc |tar -pxi --directory=../dest_dir 

這使你的目標目錄,進入源代碼目錄,並運行與-Zl(空值終止的文件列表*)和-r(遞歸)的grep。xargs -0將該列表變成tar的參數,這些參數將它們歸檔。然後另一個tar實例將它們提取到目標目錄中。

**xargs默認爲--max-procs=1,並應在一次運行一個過程,導致被級聯在一起的多個壓縮包。 tar格式應該能夠處理這一點,雖然further reading提出了一個簡單的解決方案是增加一個-iignore zeros)來提取tar來解決這個問題。我將它添加到上面的代碼,但沒有測試它。

+0

我期望大約有180,000個目錄,每個給定的字符串中只有一個html文件。所以我希望這不會產生問題。 – rusticnomad

+0

180,000。具有單個文件的總目錄是60萬個,並且將基於30個「字符串」分類爲30個奇數的子字符串,該字符串將一次運行一個。 – rusticnomad

+0

我試過了,得到這個錯誤: xargs:tar:以信號13結尾 – rusticnomad

相關問題