2012-06-20 84 views
39

的某些類型的文件的rsync副本我使用以下bash腳本來僅複製特定擴展名的文件(在本例中爲* .sh),但它仍會複製所有文件。怎麼了?只使用包含選項

 
from=$1 
to=$2 

rsync -zarv --include="*.sh" $from $to 
+3

儘管不嚴格地說與此相關,但我建議您從/ $到引用$。如果位置參數1/2包含空格,則不這樣做可能會給您意想不到的結果。 –

回答

63

我覺得--include用於包括那些以其他方式--exclude排除,而不是隻包括那些文件的文件的一個子集。

嘗試,而不是:

rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to" 

UPDATE:

rsync的版本比3.0.7高,訂單需要修改如下(見註釋)

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to" 

UPDATE
添加'-m'標誌,將避免id在目標中創建空目錄結構。在版本3.1.2中進行了測試。

+9

雖然它會得到你所有的子目錄,但是如果在你想要rsync的子目錄中有任何.sh文件,你也可以使用--include =「* /」。 –

+34

我在rsync 3.0.7版本上試過這個問題,我很久以前從macports那裏得到了這個版本,並且它沒有與includes/excludes的排序一起工作。這是我最終與我一起工作(適用於OP):'rsync -zarv --include =「* /」--include =「*。sh」--exclude =「*」「$ from」「 $爲「'。 –

+0

比茹的建議有效。答案可以更新嗎? – Jepper

8

還有一個另外:如果你需要它的擴展在同步文件中的一個目錄只有(不含遞歸的),你應該使用結構是這樣的:

rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/ 

支付你注意點在第一個--include--no-r在這種結構中不起作用。

21

@chepner的回答將會複製所有的子目錄,而不管它是否包含該文件。如果您需要排除不包含該文件的子目錄並仍保留目錄結構,請使用

rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to" 
+0

這個答案完全適合我。 +1 :) – Terry

+1

這是我的一個要求:「如果您需要排除不包含該文件的子目錄並仍保留目錄結構」+1 –

相關問題