我有一个 bash 脚本,我试图使用 rsync 在本地复制一些文件夹和档案。我有这样的事情:
RootFolder
A
B
C
D
D1
D2
D3
.
.
.
DN
E
F
我想要/做什么:
- 在开始之前清理命运文件夹,我使用选项执行此操作
--delete
- 排除我使用 option 执行的某些类型的档案
--exclude
。 - 排除我使用 option 执行的一些文件夹
--exclude
。
因此,在此之前我将拥有文件夹 A、B、D 和 E 的副本。
但现在我只需要复制D中的一些子文件夹,并且列表将根据列表而变化。
所以想象一下我想要:
A
B
D
D2
D4
D8
E
我不知道该怎么做,因为我尝试过,--include
但我做错了。
我正在做类似的事情:
rsync -av --delete --include=/D/D2 --include=/D/D4 --include=D8 --exclude=/C --exclude=/F RootFolder/ DestinyFolder
但它效果不佳......我考虑过做一些迭代,或者也许我不知道是否可以将所有这些包含在一个变量中并将其传递给 rsync。
我还有另一个疑问:当我通过参数获取目标文件夹时,如果用户使用“../”并且我有 --delete 选项,会发生什么?会删除当前文件夹吗?如果用户只写“/”,它会删除所有内容吗?
编辑: 具有:
RootFolder
A
File.txt
.HidenFile
B
C
D
D1
D2
File.txt
.HidenFile
D3
.
.
.
DN
E
F
我有类似的东西
rsync -av --delete --include=/D/D2 --include=/D/D4 --include=D8 --exclude=*.txt --exclude=.* --exclude=/C --exclude=/F RootFolder/ DestinyFolder
答案1
--include
和的选项--exclude
从左到右应用。第一个选项始终是最强的,因此您可以结束列表以--exclude='*/'
停止对目录的任何进一步处理。
但是,一旦使用--exclude='*/'
,您将禁用所有文件和目录的隐式处理,并且您将需要明确说明要包含哪些文件和文件夹。
- 您想要包含
A
,B
,E
和他们所有的文件和文件夹, - 你想要
D
它的文件而不是目录, - 你想要
D/D2
,D/D4
,/D/D8
和他们所有的文件和文件夹, - 没有其他的。
因此,我们可以像这样构造包含/排除语句
rsync --dry-run -av --delete
--include '/A' --include '/A/**'
--include '/B' --include '/B/**'
--include '/E' --include '/E/**'
--include '/D'
--include '/D/D2' --include '/D/D2/**'
--include '/D/D4' --include '/D/D4/**'
--include '/D/D8' --include '/D/D8/**'
-exclude '*/'
src/ dst/
由于您使用的bash
是一个可以处理数组的 shell,因此您可以安全地构建--include
指令集。这是一个例子:
# It's an array
includes=()
# Start with the fixed set of known directories
for known in A B E
do
includes+=('--include' "/$known" '--include' "/$known/**")
done
# Special case
includes+=('--include' '/D')
# Now the changeable set of subdirectories. You might get this list elsewhere
for subdirs in D2 D4 D8
do
includes+=('--include' "/D/$subdir" '--include' "/D/$subdir/**")
done
# Put it all together
rsync --dry-run -av "${includes[@]}" --exclude '*/' src/ dst/