2016-11-12 22 views
0

我有兩個目錄,我想要包含大部分相同的信息。 我寫了基本的腳本使用cp -ur,但只更新目錄

#!/bin/bash 

# Update the two folders 
cp -vur ../catkin_ws/src . 
cp -vur . ../catkin_ws/src 

現在我想改變這一點,只更新頂級目錄的目錄及其內容而不是其他文件,如bash腳本本身。

如果這是不可能的,有沒有辦法在更新過程中排除某些文件?

+0

閱讀'cp'的手冊頁,我沒有找到任何選項來排除特定的文件。你可以做的一個解決方法是將'cp'和'-i'標誌(提示是否要替換文件夾)以及'expect'腳本結合使用。否則,可以先列出文件夾中的所有現有文件,將其存儲在變量中,刪除要排除的文件,然後執行cp命令。 – Aserre

+0

您可能想要使用rsync來代替。除了允許你排除文件之外,它還會跳過已經相同的文件(比'cp -u'稍微聰明一些,它會複製一個相同的文件,它有一個更新的時間戳)。 – chepner

回答

0

假設您想將../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.

我沒有試圖建議更好的方法來同步目錄,但只提出了一種方法來解決你目前的做法。