如何將目錄層次結構(省略檔案)複製到不同的目錄中?

如何將目錄層次結構(省略檔案)複製到不同的目錄中?

我有一個包含子目錄的目錄,我想將其複製到另一個目錄。我目前的天真的方法是這樣的:

find src_dir -type d -exec mkdir -p dest_dir/{} \;

它可以工作,但會進行許多冗餘mkdir調用,而且也是按順序進行的。

也嘗試過這些,供參考:

# real fast
find src_dir -type d >/dev/null
# also real fast
find src_dir -type d -exec true {} +
# slower, but not as slow as mkdir
find src_dir -type d -exec true {} \;

有沒有更好的方法來減少冗餘和減少 exec 呼叫?

答案1

使用 rsync 和過濾 (-f),您可以過濾目錄並過濾掉其他所有內容,如下所示:

rsync -av -f "+ */" -f "- *" src_dir/ new_dir/

答案2

您可以將 變更;+find ... -exec從而減少進程呼叫的次數。在這種情況下,您需要使用一小部分 shell 來展開將傳入的目錄清單:

find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +

echo刪除您對它能如預期運作感到高興的兩個實例。 (特別注意,您最終會得到dest_dir/src_dir/...; 如果您不希望這樣,請改用這種類型的構造,記住確保將其dest_dir重寫為絕對路徑):

cd src_dir && find -type d ...

相關內容