gpt4 book ai didi

linux - 使用 Rsync 过滤器包含/排除文件

转载 作者:IT王子 更新时间:2023-10-29 00:42:00 25 4
gpt4 key购买 nike

我正在尝试备份文件系统,排除 /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 3.1.2 手册)

Note that, when using the --recursive (-r) option (which is implied by -a), every subcomponent of every path is visited from the top down, so include/exclude patterns get applied recursively to each subcomponent's full name (e.g. to include "/foo/bar/baz" the subcomponents "/foo" and "/foo/bar" must not be excluded). The exclude patterns actually short-circuit the directory traversal stage when rsync finds the files to send. If a pattern excludes a particular parent directory, it can render a deeper include pattern ineffectual because rsync did not descend through that excluded section of the hierarchy. This is particularly important when using a trailing '*' rule. For instance, this won't work:

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

This fails because the parent directory "some" is excluded by the '*' rule, so rsync never visits any of the files in the "some"or "some/path" directories. One solution is to ask for all directories in the hierarchy to be included by using a single rule:"+ */" (put it somewhere before the "- *" rule), and perhaps use the --prune-empty-dirs option. Another solution is to add spe-cific include rules for all the parent dirs that need to be visited. For instance, this set of rules works fine:

         + /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 参数你应该能够调试你的问题:)

关于linux - 使用 Rsync 过滤器包含/排除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com