2011-11-25 172 views
19

我想用rsync將項目複製到我的服務器。 我有項目的具體子目錄中的安裝腳本rsync排除一個目錄,但包括一個子目錄

項目/規格/安裝/ PROJECT1

我所要做的是排除一切都在項目/規格目錄,但具體安裝目錄中的項目:項目/規格/安裝/項目1

rsync -avz --delete --include=specs/install/project1 \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

但這樣的規格目錄的內容被排除,但是在安裝/ PROJECT1目錄不包括得到。

我已經試過一切,但我只是似乎沒有得到這個工作

+1

剛剛在linuxquestions.org上找到了一個類似的問題,可能有所幫助:http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris

+0

謝謝,解決了它!有時Rsync確實有一個奇怪的邏輯。 – user1036651

+0

Duplicates http://stackoverflow.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –

回答

29

有時它只是一個細節。

只要改變你的方式包括增加一個尾隨/在年底包括模式,它會工作:

rsync -avz --delete --include=specs/install/project1/ \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

或者,在替代方案,製作了過濾器文件是這樣的:

$ cat <<EOF>pattern.txt 
> + specs/install/project1/ 
> - specs/* 
> EOF 

然後使用--filter選項:

rsync -avz --delete --filter=". pattern.txt" \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

如需進一步信息請訪問的過濾規則部分rsync(1)手冊頁。

+2

過濾規則確實是處理比「排除所有.git目錄」更復雜的任何事情的唯一理智方式。 –

8

另一種解決方案在這裏不起作用。


可靠的方式

你別無選擇,只能手動下降爲您的子目錄,每個級別。包含不需要的文件沒有風險,因爲rsync不包括包含目錄的文件。

1)創建一個包含過濾器文件,例如 「include_filter.txt」:

+ /specs/ 
+ /specs/install/ 
+ /specs/install/project1/*** 
- /specs/** 

2)運行它:

rsync -avz --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 
  • 不要忘了啓動斜槓「/ 「,否則你可能會匹配名爲」**/specs/install/project1 /「的子目錄。
  • 通過選擇包含類型過濾器(--include-from = FILE),啓動加「+」符號實際上是可選的,因爲這是沒有符號的默認操作。 (默認情況下,您可以使用--exclude-from = FILE來設置相反的「 - 」。)
  • 的雙星 「**」 是指 「任何路徑」
  • 的三連星 「***」 是指 「任何路徑,包括這個非常目錄」

簡單的方法

你可以開始你的過濾器「* /」,允許rsync下降你所有的子級別。這很方便,但是:

  • 所有目錄都將被包括在內,儘管爲空。這可以通過rysnc選項-m修復,但是所有空的目錄都會被跳過。

1)創建一個包含過濾器文件,例如 「include_filter.txt」:

+ /**/ 
+ /specs/install/project1/*** 
- /specs/** 

2)運行它:

rsync -avzm --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

注意添加的選項-m。

相關問題