我想使用rsync从服务器下载特定文件,这是目录的方案:

.
file1
fakeotherfolder
   filefile
   morefile
   morefakefolder
      file
file2
file3
mainfolder
   myfolder1
      folfile1
      folfile2
   myfolder2
      folfile1
      folfile2
   myfolder3
      folfile1
      folfile2
   myfolder4
      folfile1
      folfile2

基本上,我想获取所有不在mainfolder/myfolder*中的文件,例如特定的mainfolder/myfolder2

最后我想要什么:
 .
file1
fakefolder
   filefile
   morefile
   morefakefolder
      file
file2
file3
mainfolder
   myfolder2
      folfile1
      folfile2

我尝试了rsync与以下选项:
rsync --include="*/mainfolder/myfolder2/*" --exclude="*/mainfolder/*"
,但是我得到的是一个空的主文件夹...
 .
file1
fakefolder
   filefile
   morefile
   morefakefolder
      file
file2
file3
mainfolder

最佳答案

什么地方出了错

rsync --include="*/mainfolder/myfolder2/*" --exclude="*/mainfolder/*"
  • 伪指令--include="*/mainfolder/myfolder2/*"告诉rsync将文件包括在*/mainfolder/myfolder2/目录下。您可能认为它应该隐式告诉它包括目录*/mainfolder/myfolder2/,但实际上不包含。它仅包括该目录下的文件。
  • 指令--exclude="*/mainfolder/*"告诉它排除*/mainfolder下的所有文件和目录。这意味着它不包含*/mainfolder/myfolder2/。由于不包含myfolder2,因此将永远不会检查其下的文件。

  • 如何修复

    解决方案是显式包括mainfolder/myfolder2:
    rsync --include="mainfolder/myfolder2" --include="mainfolder/myfolder2/*" --exclude="mainfolder/*" src/ dest
    

    解决方案是显式包括mainfolder/myfolder2:

    请注意,resync解释按声明顺序包括/排除。因此,重要的是--include="mainfolder/myfolder2"出现在--exclude="mainfolder/*"之前。总之,我们需要三个指令,而exclude指令必须位于最后:
  • --include="mainfolder/myfolder2"
  • --include="mainfolder/myfolder2/*"
  • --exclude="mainfolder/*"
  • 10-07 12:26