2016-11-02 25 views
3

我在/home/ziga/Mounted/中有兩個子目錄。每個那些有多個非空的子目錄:如何使用find創建子目錄的副本

/home/ziga/Mounted/dir1/subdir1-1 
/home/ziga/Mounted/dir1/subdir1-2 
... 

/home/ziga/Mounted/dir2/subdir2-1 
/home/ziga/Mounted/dir2/subdir2-2 
... 

有沒有辦法使用find創造目錄,說/home/ziga/CombinedMounts,將有完全相同的名稱作爲那些兩級內心深處/home/ziga/Mounted/?這是最終的結果我在尋找:

/home/ziga/CombinedMounts/subdir1-1 
/home/ziga/CombinedMounts/subdir1-2 
/home/ziga/CombinedMounts/subdir2-1 
/home/ziga/CombinedMounts/subdir2-2 
... 

我可以使用此命令的目錄列表:

find /home/ziga/Mounted/ -maxdepth 2 -mindepth 2 -type d ! -name "lost+found" ! -name ".Trash*" -exec basename {} \; 

但我不能爲我的生活弄清楚如何使用其輸出在mkdir -p,這樣我就可以得到想要的子目錄。

不知怎的,他們總是在/home/ziga/CombinedMounts/home/ziga/Mounted/...

最終我失去了我的腦海裏,請大家幫忙。 :)

注意:某些目錄名稱包含空格!

+0

你可以設置結果作爲數組的元素?像'DIRS =(\'<你的查找狀態>')。然後在$ DIRS中使用'for dir來創建每個目錄。 – Gavin

+0

如果目錄名稱中有空格,這會起作用嗎? – zigamilek

+0

哦,也許不是。我不是bash專家,只是在這裏吐唾沫。 – Gavin

回答

2

試試這個:

find /home/ziga/Mounted/ -maxdepth 2 -mindepth 2 \ 
    -type d ! -name "lost+found" ! -name ".Trash*" \ 
    -exec sh -c 'mkdir -p /home/ziga/CombinedMounts/"$(basename "$0")"' "{}" \; 

我只能解釋,你有沒有在問題中提到的部分。

我們調用了sh,因爲我們無法可靠地將{}佔位符轉換爲像mkdir -p "/path/$(basename "{}")"這樣的表達式。該表達式對佔位符看起來也不清楚。

-c選項從命令字符串後的操作數的值設置參數0的價值(參見手冊頁sh):從command_string操作

-c讀命令。從剩餘的參數操作數中依次從command_name操作數的值和位置參數($1,$2等)中依次設置特殊參數0(請參見第2.5.2節「特殊參數」)的值。不應從標準輸入中讀取命令。

+0

令人驚歎!就是這個! :) – zigamilek

+0

感謝您的詳細的答案,尤其是各種引用和括號的正確位置;)那些總是讓我發瘋。在將我的頭撞了幾個小時之後,您只需幾分鐘即可向我提供解決方案。再次感謝! – zigamilek