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
我正在尝试使用 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