2016-06-20 150 views
1

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

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

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

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

我试过这个样子的

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命令,如果我尝试这个

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

则将排除所有文件夹中的文件。

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

+0

为什么这个问题标记为Perl语言? – Borodin

+0

'man rsync'搜索'INCLUDE/EXCLUDE PATTERN RULES'。它涵盖了通配符排除。 – xxfelixxx

+0

如果你试图用perl运行rsync,你可能会因为shell转义而被咬,所以你可能需要尝试转义'*'字符。 – xxfelixxx

回答

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 
+0

谢谢,这将起作用。尽管有一个限制。我需要确保目录树中的其他任何地方都不会有另一个'src'(或任何我称之为)的文件夹,否则它也可能与排除规则匹配。 – user1751825

+0

其实只是想出如何正确地做到这一点,我可以这样做--exclude =/$ SRC/*。pm这确保它只会应用在根文件夹级别。 – user1751825

相关问题