
我有一個如下所示的來源目錄(src 和 bin 目錄內有許多子目錄):
- 頂層目錄
- 項目1
- 原始碼/
- 垃圾桶/
- 腳本/
- 一些文件.txt
- 項目2
- 原始碼/
- 垃圾桶/
- 目標
- 垃圾桶/
- 檔案.xml
- 項目1
我想將直接在專案目錄下的 bin 目錄(即忽略 top_dir/proj2/target/bin/ )及其內容同步到目標目錄,以便它看起來像這樣:
- 頂層目錄
- 項目1
- 垃圾桶
- 項目2
- 垃圾桶
- 項目1
我可能可以透過在include-from 檔案中明確列出每個bin 目錄(在我的實際場景中大約有15 個)來使其工作,但我在想必須有一種方法來表示我想要同步所有top_dir/ */bin 目錄。
答案1
可能性1
使用 shell 擴充1 代替rsync
的篩選規則,可以執行下列操作:
A。要包含層次結構bin
中的所有目錄top_dir
:
rsync -av -R top_dir/**/bin/ destination_path
這-R
是一個 rsync 2參數代表相對的。man rsync
解釋為
使用相對路徑。這意味著命令列上指定的完整路徑名將發送到伺服器,而不僅僅是檔案名稱的最後部分。當您想要同時發送多個不同的目錄時,這特別有用。
但本質上這意味著目錄結構被保留。
**
bin
是一種 shell 通配模式,並遞歸搜尋top_dir
.因此,在上面的範例中,命令列擴展為:
rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path
b.如果您只想包含bin
專案目錄下一層的目錄,只需使用一個*
(也適用於「古代」shell!):
rsync -av -R top_dir/*/bin/ destination_path
1您需要最近巴什版本 (>4) 並透過 啟動遞歸通配符shopts -s globstar
。和桀騁遞歸通配符是預設的。
2 Linux 上的 rsync 版本 v3.2.3 協定版本 31。
可能性2
僅使用 rsync 的篩選規則,您需要:
A。要包含層次結構bin
中的所有目錄top_dir
:
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
第一個include
規則可能不明顯3/
但保證搜尋所有目錄(注意尾隨),第二個規則添加bin
目錄中的所有內容,並且該exclude
規則排除其他所有內容。-m
確保不複製空目錄。
b.僅包含項目目錄下的一級:
rsync -av -m --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path
使用***
rsync >= 2.6.7 的語法。/
模式中的前導代表top_dir
,否則模式將與結尾文件路徑的。
3搜尋/some/path/this-file-will-not-be-found
於man rsync
答案2
您可以src
使用排除所有目錄--exclude src/