Find

遞歸複製文件到所有最深的子目錄

  • July 25, 2020

我正在嘗試將單個文件複製到樹結構中所有最深的子目錄。想像一下它看起來像這樣:

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-typeand-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因此不需要。

引用自:https://unix.stackexchange.com/questions/599566