如何 rsync 一組子目錄?

如何 rsync 一組子目錄?

我有一個如下所示的來源目錄(src 和 bin 目錄內有許多子目錄):

  • 頂層目錄
    • 項目1
      • 原始碼/
      • 垃圾桶/
      • 腳本/
      • 一些文件.txt
    • 項目2
      • 原始碼/
      • 垃圾桶/
      • 目標
        • 垃圾桶/
      • 檔案.xml

我想將直接在專案目錄下的 bin 目錄(即忽略 top_dir/proj2/target/bin/ )及其內容同步到目標目錄,以便它看起來像這樣:

  • 頂層目錄
    • 項目1
      • 垃圾桶
    • 項目2
      • 垃圾桶

我可能可以透過在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-foundman rsync

答案2

您可以src使用排除所有目錄--exclude src/

相關內容