2016-06-20 201 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

相關問題