Find
遞歸複製文件到所有最深的子目錄
我正在嘗試將單個文件複製到樹結構中所有最深的子目錄。想像一下它看起來像這樣:
bar dir1 | | | +--dir2 | | | +--dir3 | +--dir4 | | | +--dir5 | +--dir6 | | | +--dir7
我希望“bar”僅複製到最深的子目錄,如下所示:
bar dir1 | +--dir2 | | | +--dir3 | | | +-- bar | +--dir4 | | | +--dir5 | | | +-- bar | +--dir6 | | | +--dir7 | | | +-- bar
我不確定如何解決這個問題,因為文件有時會出現在中間目錄中,但我找不到針對最深子目錄的方法。
編輯:我試圖解決這個問題。這會不一致地複製到所有目錄,仍然出於某種原因,而不僅僅是最深的目錄。
find . -exec cp -r bar {} \; -type d -links 2
您可以使用:
find . -type d -links 2 -exec cp file {} \;
它將找到具有 2 個硬連結的目錄,然後將您的文件複製到該特定目錄。
解決方案:在包含 的目錄中
bar
,find . -type d -links 2 -exec cp bar {} \;
你最初的嘗試
find . -exec cp -r bar {} \; -type d -links 2
不包含語法錯誤,但未按預期執行。因為
-exec
在-type
and-links
過濾器之前,過濾器永遠不會應用並exec
獲取目前目錄下(包括)下的所有內容,不僅是正常文件,還有目錄。如果您不相信,請檢查輸出find . -exec echo X{}X \; -type d -links 2 -exec echo Y{}Y \;
您將看到所有文件都列在兩個之間
X
,但只有正確的dir{3,5,7}
文件位於兩個之間Y
。這就解釋了為什麼bar
也會出現在中間目錄中。此外,該
-r
選項啟動遞歸副本。由於正在複製的是正常文件 (bar
),-r
因此不需要。