Rsync

rsync排除目錄不起作用

  • October 8, 2021

我正在執行 Fedora 17 64 位,但rsync --exclude=/home/ben/<dir>沒有按預期工作。

我正在嘗試將rsync我的主目錄指向拇指驅動器,但我想排除包含記憶體文件和建構文件的目錄。這是我正在使用的命令:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

但是,來自~/build和的內容~/.ccache正在被 複製rsync。我究竟做錯了什麼?

rsync以前導開頭的全域過濾規則/錨定傳輸的根。引用手冊頁的“包含/排除模式規則”部分:

如果模式以 / 開頭,則將其錨定到文件層次結構中的特定位置,否則將與路徑名的末尾匹配。這類似於正則表達式中的前導 ^。因此,“/foo”將在“傳輸的根”(對於全域規則)或合併文件的目錄(對於每個目錄規則)中匹配名稱“foo”。

在您的命令 ( rsync ... -arv /home/ben home-ben/) 中,文件/home/ben/foo將被傳輸到home-ben/ben/foo. 轉移的根是home-ben,正確的過濾路徑是/ben/foo。因此,

  • 匹配/home/ben/.ccache你需要一個過濾器路徑/ben/.ccache
  • 匹配/home/ben/build/你需要一個過濾器路徑/ben/build/

更詳細的解釋可以在rsync(1)手冊頁的“ANCHORING INCLUDE/EXCLUDE PATTERNS”部分找到。


請注意,簡單地省略前導/不一定是您想要的。再次引用同一手冊頁部分:

不合格的“foo”將匹配樹中任何位置的“foo”名稱,因為該算法是自上而下遞歸應用的;它的行為就像每個路徑組件在文件名的末尾都有一個轉折。即使是未錨定的“sub/foo”也會匹配層次結構中在名為“sub”的目錄中找到“foo”的任何點。有關如何指定與傳輸根匹配的模式的完整討論,請參閱錨定包含/排除模式部分。

因此,過濾器模式build/將匹配任何地方的建構目錄/home/ben,甚至/home/ben/many/sub/directories/build/.

引用自:https://unix.stackexchange.com/questions/83394