Bash 脚本和 rsync:如何仅包含一些文件夹和子文件夹以及如果我使用 ../ 作为带有 --delete 的路径会发生什么

Bash 脚本和 rsync:如何仅包含一些文件夹和子文件夹以及如果我使用 ../ 作为带有 --delete 的路径会发生什么

我有一个 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/

相关内容