我正在尝试使用rsync设置Perl Web部署脚本。
我需要排除一些基于通配符的文件,但只能从特定的文件夹而不是它们的子文件夹中排除。
如果我只列出要排除的文件名,那么它们将被排除在任何目录之外,但如果我包含完整路径(源或目标),我无法使它们匹配,因此不会排除它们。
我试过的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
而不是其子文件夹中排除这些文件?
答案 0 :(得分:1)
问题在于$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