假設您想將../catkin_ws/src
與當前目錄同步,並且當前腳本位於當前目錄中。據我所知,您只想同步頂層目錄及其內容,但不想同步其他類型的可能位於頂層的節點,即直接在../catkin_ws/src
或./
之內。
,則很容易與find
命令來完成:
src_dir="../catkin_ws/src"
find "$src_dir" -mindepth 1 -maxdepth 1 -type d \
-exec cp -vru {} . \;
find ./ -mindepth 1 -maxdepth 1 -type d \
-exec cp -vru {} "$src_dir" \;
哪裏找到{}
代表的下一個目錄。
如果您想進一步過濾,可以使用其他選項,如-name
,-path
或-regex
。例如,下面的目錄跳過x
:
find "$src_dir" -mindepth 1 -maxdepth 1 -type d \
! -name 'x' \
-exec cp -vru {} . \;
其中!
是使下一個表達式來返回True
,如果表達式爲假,即作爲某種邏輯NOT
運算符。
上述命令的缺點是對每個文件夾順序啓動cp
命令(由於\;
)。如果您想針對所有來源運行單一cp
命令,則可以使用this中所述的方法回答。
P.S.
我沒有試圖建議更好的方法來同步目錄,但只提出了一種方法來解決你目前的做法。
閱讀'cp'的手冊頁,我沒有找到任何選項來排除特定的文件。你可以做的一個解決方法是將'cp'和'-i'標誌(提示是否要替換文件夾)以及'expect'腳本結合使用。否則,可以先列出文件夾中的所有現有文件,將其存儲在變量中,刪除要排除的文件,然後執行cp命令。 – Aserre
您可能想要使用rsync來代替。除了允許你排除文件之外,它還會跳過已經相同的文件(比'cp -u'稍微聰明一些,它會複製一個相同的文件,它有一個更新的時間戳)。 – chepner