我正在编写一个部署脚本,用于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
前导斜杠表示该名称仅在目录本身内匹配,而不在任何子目录中匹配。