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

时间:2016-06-20 04:32:01

标签: perl rsync

我正在尝试使用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而不是其子文件夹中排除这些文件?

1 个答案:

答案 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
相关问题