rsync-如何在使用每个文件的相对路径时从文件的所有实例中排除?

rsync-如何在使用每个文件的相对路径时从文件的所有实例中排除?

我正在编写一个部署脚本,用于rsync将克隆的存储库文件与网站目标目录同步。我试图让我的用户能够将.exclude文件放置在存储库中的任何位置,这样他们就可以根据相对路径排除文件。

例如,如果用户folder在其存储库中有一个子目录,其中有一个名为的文件.dontdeploythis,则他们应该能够将一个.exclude文件放在其旁边,其内容为,.dontdeploythis而不是.exclude在存储库的顶层放置一个文件,其内容为folder/.dontdeploythis

我偶然发现了一些文章解释如何做到这一点,但我无论如何也找不到它了。

如果您有任何答案,请告诉我。提前谢谢您!

答案1

您需要--exclude-from为目录树中找到的每个 .exclude 文件添加。find命令可以完整使用为 -

In below example I've files to ignore like "ignore1|2|3"
[root@puppetmaster ~]# find . -xdev -name ig*
./folder/folder2/ignore2
./folder/folder3/ignore3
./folder/ignore1

我已将它们包含在各自的目录中的 .exclude 中

[root@puppetmaster ~]# find . -xdev -name  .exclude
./folder/folder2/.exclude
./folder/folder3/.exclude
./folder/.exclude

现在找到所有目录中的所有 .exclude

[root@puppetmaster folder]# for i in `find . -xdev -name .exclude`; do echo -n "--exclude-from $i "; done > /tmp/test

将所有 --exclude-from 字符串分配给 J

J=`cat /tmp/test`

[root@puppetmaster folder]# rsync -avz --exclude .exclude  $J  . /tmp/testing/
sending incremental file list
./
test1
folder2/
folder2/test2
folder3/
folder3/test3

sent 239 bytes  received 80 bytes  638.00 bytes/sec
total size is 0  speedup is 0.00

我只是给你一个我脑海中的快速逻辑,这在一次快速测试中对我有用。希望它能帮助你编写脚本。

答案2

您可以为此使用每个目录的规则。

rsync -av --filter=':e- .exclude' /some/path/ remote:/dest/

然后 rsync 会在每个目录中查找是否有 .exclude 文件,如果有,则将其中的模式视为排除列表(这就是 的作用-,您也可以省略-,然后内容将用作通用过滤文件;但这会与名为 的文件混淆.exclude)。e后面的:表示文件本身也被排除在传输之外。

在您的示例中,内容.exclude将是:

/.dontdeploythis

前导斜杠表示该名称仅在目录本身内匹配,而不在任何子目录中匹配。

相关内容