rsync - 排除文件夹中的文件但包括子文件夹

rsync - exclude files in folders but include subfolders

我正在尝试使用 rsync 设置 Perl 网络部署脚本。

我需要根据通配符排除一些文件,但仅限于特定文件夹而不是它们的子文件夹。

如果我只列出要排除的文件名,那么它们将被排除在任何目录之外,但如果我包含完整路径(源或目标),我无法让它们匹配,所以它们不匹配排除。

我试过的 rsync 命令是这样的

rsync --recursive --force --delete --progress --exclude='$SOURCE_DIR/index.cgi' --exclude='$SOURCE_DIR/*.pm' "$SOURCE_DIR" "$DEST_DIR"

rsync --recursive --force --delete --progress --exclude='$DEST_DIR/index.cgi' --exclude='$DEST_DIR/*.pm' "$SOURCE_DIR" "$DEST_DIR"

这些似乎都不起作用,如果我尝试这个

rsync --recursive --force --delete --progress --exclude='index.cgi' --exclude='*.pm' "$SOURCE_DIR" "$DEST_DIR"

然后它将排除所有文件夹中的文件。

我需要做什么才能仅从 $DEST_DIR folder 中排除这些文件,而不是从其子文件夹中排除?

问题是 $SOURCE_DIR 用于排除模式本身。我认为 rsync 只看到比 $SOURCE_DIR 更深的相对路径,所以排除不起作用。

解决方案是从上一层开始同步。

test_rsync.sh

#!/bin/bash

BASE=testing
SRC=src
DEST=dest

rm -rf $BASE

mkdir -p $BASE/$SRC/foo/bar/baz/qux
mkdir -p $BASE/$SRC/abc/def/ghi
mkdir -p $BASE/$SRC/qwe/rty

for dir in $( find $BASE/$SRC -type d | grep "[a-z]" ); do
    touch $dir/index.cgi
    touch $dir/Foo.pm
    touch $dir/Bar.pm
done

rsync --recursive --force --delete --exclude=index.cgi --exclude=$SRC/*.pm $BASE/$SRC $BASE/$DEST

diff -r $BASE/$SRC $BASE/$DEST/$SRC | sort -r

输出

Only in testing/src/qwe/rty: index.cgi
Only in testing/src/qwe: index.cgi
Only in testing/src: index.cgi
Only in testing/src: Foo.pm
Only in testing/src/foo: index.cgi
Only in testing/src/foo/bar: index.cgi
Only in testing/src/foo/bar/baz/qux: index.cgi
Only in testing/src/foo/bar/baz: index.cgi
Only in testing/src: Bar.pm
Only in testing/src/abc: index.cgi
Only in testing/src/abc/def: index.cgi
Only in testing/src/abc/def/ghi: index.cgi