使用 Rsync 包含和排除选项包含目录和子目录但排除子目录中的文件

使用 Rsync 包含和排除选项包含目录和子目录但排除子目录中的文件

我想知道我的场景是否真的可以用 rsync 来处理。 Rsync 在我的本地和远程之间工作正常。

htdocs/    
  folderswithfilesIneed/
    somefilesandfolders.jpg
    afolder/
      somefiles.png
  version/
    photofolder/
      photowithstupidname.jpg
      ...
   anotherfolderwithstupidname/
      photowithstupidname.jpg
      ...
   ...

我想同步所有这些文件和文件夹,但排除“photofolder”和“anotherfolderwithstupidname”中的所有文件

有人一次性想到这一点吗?

编辑:更清楚地说,“版本”中有很多文件夹,所以我无法一一排除它们的内容。

答案1

当然,使用排除规则很容易做到这一点。要排除目录及其所有内容,只需排除目录本身,甚至不会遍历它。要包含目录somedir但不包含其内容(即传输空目录),请排除somedir/*。当排除子句以 开头时/,它是从您正在同步的目录的根开始的路径。

rsync -a --exclude='/version/photofolder/*' --exclude='anotherfolderwithstupidname/*' htdocs/ elsewhere/

如果要包含所有子目录…/version但不包含非目录文件…/version并且不包含子目录的内容:

rsync -a --include='/version/*/' --exclude='/version/*' htdocs/ elsewhere/

如果您想包含 的所有子目录…/version及其内容,但不包含以下非目录文件…/version

rsync -a --include='/version/*/' --include='/version/*/*' --exclude='/version/*' htdocs/ elsewhere/

答案2

新的命令字符串创建 --included 目录并复制其内容目录和/或文件,但只有 2 个目录深。为什么?

rsync -avid --progress ~/MyDocuments/'Inet Publishing'/ --recursive --include='LandisTwo (2019)' --include='LandisTwo (2020) {backup}' --include='*.*' --exclude='**/' e6420:/home/landis/Media/2TBackup/Backups/MyDocuments/"Inet\ Publishing"/ | tee -a ~/logs/Backup-InetPublishing_2020.txt
  • 我发现目录已创建,但没有文件复制到其中(无递归)。父目录中的文件被复制,但不复制子目录 - 对其进行处理。

这对我有用,从工作站到服务器,除了 rysnc'ing 父 ../Inet\ Publishing 时的整个目录和所有站点(-avin 中的“n”)之外,还可以将我的个人站点备份(rysnc)到另一台服务器是“试运行”,请删除。)。

--exclude */ 是“Inet Publishing/”中的所有其他目录,并且似乎必须在 --include per man rsync process order 之后(如果在 --include 之前,则所有内容都是 --excluded 并且不再处理进一步的令牌,至少我是这么读的,并且在实践中是这样想出这个的)。

这实际上是我用 cron 运行的脚本之一中的一行。 *显然,目标主机可以是一个IP,我在/etc/hosts中定义了主机,并且有ssh密钥对,,,所以我使用主机名。

rsync -avin --progress ~/MyDocuments/'Inet Publishing'/ --include='LandisTwo (2019)' --include='LandisTwo (2020) {备份}' --exclude='*/' e6420:/home /landis/Media/2TBackup/Backups/MyDocuments/ | tee -a ~/logs/Backup-InetPublishing_2020.txt

相关内容