簡體   English   中英

使用Rsync過濾器來包含/排除文件

[英]Using Rsync filter to include/exclude files

我正在嘗試備份一個文件系統,排除/mnt但在/mnt包含一個特定的路徑,看起來好像使用--filter建議使用--include和--exclude,但我似乎無法獲得它來做我的出價,例如:

rsync -aA -H --numeric-ids -v --progress --delete \
  --filter="merge /tmp/mergefilter.txt" /  /mnt/data/mybackup/

我的/tmp/mergefilter.txt說:

+ /mnt/data/i-want-to-rsyncthisdirectory/
- /dev
- /sys/
- /tmp/
- /run/
- /mnt/
- /proc/
- /media/
- /var/swap
- /lost+found/

所有以“ - ”開頭的路徑都會被忽略,但是我的/mnt/data/i-want-to-rsyncthisdirectory/似乎永遠不會得到rsync 順序和/或包含/排除尾部斜杠似乎不會改變與我想要包含的路徑相關的行為。

編輯:請注意,我確實要根據指定為/的源備份/ etc / usr / var等

感謝任何指導,因為手冊頁有點像雷區......

對我來說,這個命令正在完成這項工作:

rsync -aA -H --numeric-ids -v --progress --delete \
--filter="+ /mnt/data/i-want-to-rsyncthisdirectory/" \
--filter="- *" . /mnt/data/mybackup/

基本上,我使用了一個+過濾器來討論所討論的目錄並驅逐所有其他目錄(正如你在給定的例子中所做的那樣)。

無需明確否定您不想同步的所有目錄。 相反,您可以忽略所有問題之外的所有問題。

這個問題很老了,但我認為這可能會對你有所幫助:

(來自rsync 3.1.2手冊)

注意,當使用--recursive(-r)選項(由-a暗示)時,從上到下訪問每個路徑的每個子組件,因此包含/排除模式以遞歸方式應用於每個子組件的全名(例如,要包含“/ foo / bar / baz”,不得排除子組件“/ foo”和“/ foo / bar”。 當rsync找到要發送的文件時,排除模式實際上會使目錄流量階段短路。 如果模式排除特定的父目錄,則它可以呈現更深層的包含模式無效,因為rsync沒有通過層次結構的排除部分下降。 使用尾隨'*'規則時,這一點尤為重要。 例如,這不起作用:

  + /some/path/this-file-will-not-be-found + /file-is-included - * 

這失敗是因為父目錄“some”被'*'規則排除,因此rsync從不訪問“some”或“some / path”目錄中的任何文件。 一種解決方案是通過使用單個規則要求包含層次結構中的所有目錄:“+ * /”(將其放在“ - *”規則之前的某處),並且可能使用--prune-empty-dirs選項。 另一種解決方案是為需要訪問的所有父目錄添加特定的包含規則。 例如,這套規則運行正常:

  + /some/ + /some/path/ + /some/path/this-file-is-found + /file-also-included - * 

我在原來的答案中提出了一些沒有錯的東西(我測試了它)。 我重現了一個類似於你的樹,這個解決方案現在應該可以工作:

 + /mnt/ + /mnt/data/ + /mnt/data/i-want-to-rsyncthisdirectory/ - /mnt/data/* - /mnt/* - /dev - /sys/ - /tmp/ - /run/ - /proc/ - /media/ - /var/swap - /lost+found/ 

說明:

(最后只重寫手冊,但正如你所說,手冊有點神秘)

每次必須通過rsync傳輸文件時,都會從上到下讀取規則。 但是在你的情況下/ mnt / data / i-want-to-rsyncthisdirectory /沒有備份,因為你排除/ mnt並且這會使你的包含規則短路。 因此,解決方案是將每個文件夾和子文件夾包括在要備份的文件夾中,然后排除您不希望通過子文件夾備份子文件夾的內容。

請注意每個子文件夾排除結束時的* 這將阻止rsync備份位於這些子文件夾中的文件和文件夾,這是您想要的。

更簡單的解決方案:(編輯2)

您甚至可以使用2.6.7版中添加的***模式簡化此操作:

 + /mnt/ + /mnt/data/ + /mnt/data/i-want-to-rsyncthisdirectory/*** - /mnt/** 

此運算符允許您使用**通配符進行排除,因此只有一個排除行。

我還發現,由於以下rsync參數,您可以了解哪些過濾規則排除/包含每個文件或文件夾:

 --verbose --verbose 

結合--dry-run參數你應該能夠調試你的問題:)

如果其他人像我一樣正在與此作斗爭,我已設法讓以下工作。 在我的情況下,我有選擇地從另一台服務器同步存儲庫。

將過濾器放在文件中:

+ epel/
+ epel/7/
+ epel/7/x86_64/
+ epel/7/x86_64/Packages**
+ epel/7/x86_64/repodata**
- **

然后可以按預期同步所有內容:

cd /srv/repo
rsync -rvzP -f 'merge /home/user/sync-filter.txt' ./ user@remote:/srv/repo/

最初,我使用epel/7/x86_64/Packages/**設置了我的過濾器文件,由於**之前的斜杠,它無法工作。 卸下/使這一切成為春季以生命為目的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM