保留目錄結構,在直通模式下使用cpio
。 cpio
大約與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 -Zl
與cpio -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提出了一個簡單的解決方案是增加一個-i
(ignore zeros)來提取tar
來解決這個問題。我將它添加到上面的代碼,但沒有測試它。
我假設你有第一個代碼塊的拼寫錯誤,其中'.htmk'實際上應該是'.html' –