仅 rsync 指定子目录中的某些文件类型

仅 rsync 指定子目录中的某些文件类型

这是我的源目录结构:

../openwrt
../openwrt/BackupOfPackages
../openwrt/BackupOfSettings
../openwrt/BackupOfImages

我想使用 rsync 将其镜像到目标目录。我只想rsync三个子目录中的文件,并且只想同步扩展名为:
.installedfrom thefolderfromthefolderfromthefolder的BackupOfPackages文件
.img.gzBackupOfImages
.tar.gzBackupOfSettings

在我的源目录中,我在 basedir“openwrt”和每个子目录中混合了各种文件。但是,如上所述,我只想同步特定子目录中的特定文件类型。

在此输入图像描述

这是我的 rsync 命令:

openWrtPath="/mnt/usb/openwrt/"  
ncpPath="/media/myCloudDrive/openwrt"

rsync -vvrit --include='/' --include='BackupOfSettings/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/' --include='BackupOfPackages/**.installed' --include='BackupOfImages/' --include='BackupOfImages/**.img.gz' --exclude='/*' --delete --delete-excluded $openWrtPath ncp:$ncpPath

当我运行命令时,这就是它显示和隐藏的内容。它正确地从 basedir 中隐藏 opkg.installed 和“新文件夹”,但不会隐藏 BackupOfSettings 和 BackupOfImages 等中的 .installed 等文件类型。

在此输入图像描述

Rsync 同步从源到目标的几乎所有内容? 在此输入图像描述

如何更改 rsync 命令以仅复制扩展名为:
.installedBackupOfPackages文件夹
.img.gzBackupOfImages文件夹
.tar.gzBackupOfSettings文件夹
即:正确隐藏不应从各个子目录传输到目标的任何文件类型,即使它们存在于源计算机上的这些子目录中。

更新

在我发布后,我想我找到了答案..当我更改--exclude='/*'为它时--exclude='*',它似乎按我想要的方式工作。有人可以解释这两个排除之间的区别吗?

的意思是'/*'“排除basedir(openwrt)中的所有内容,这不适用于basedir的子目录”

谢谢你!

答案1

是否'/*'意味着:“排除basedir(openwrt)中的所有内容,这不适用于basedir的子目录”?

是的,/是传输目录的根目录,与/*那里的所有内容(文件和目录)匹配。

您可以将命令中的包含缩短为:

rsync -ai \
  --include='BackupOf***/' \
  --include='BackupOfImages/**.img.gz' \
  --include='BackupOfSettings/**.tar.gz' \
  --include='BackupOfPackages/**.installed' \
  --exclude='*' \
  --delete --delete-excluded \
  "$openWrtPath" ncp:"$ncpPath"

这里的--include='BackupOf***/'意思是包括所有以 开头的目录BackupOf及其子目录(例如BackupOfImages/sub1/sub2/)。如果您不需要包含这些子目录,请将其更改为BackupOf*/,您还可以将**文件扩展名的两个更改为一个*

我使用了存档模式-a,其中包括-t和其他选项并引用了这两个变量。

答案2

/rsync在它考虑的路径的开头不包含 a 。为什么?设计师的选择。

但还有另一个问题。您已在包含中使用 ** 来包含子目录中的文件。但是,子目录本身被排除在外。尝试将包含和排除更改为:

--include='*/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/**.installed' --include='BackupOfImages/**.img.gz' --exclude='*' --prune-empty-dirs

这是:包含所有目录,仅包含您想要的文件,不包含其他文件,并删除空目录。

另一种选择是写:

--include='BackupOfSettings/' --include='BackupOfSettings/**/' --include='BackupOfSettings/**.tar.gz' --include='BackupOfPackages/' --include='BackupOfPackages/**/' --include='BackupOfPackages/**.installed' --include='BackupOfImages/' --include='BackupOfImages/**/' --include='BackupOfImages/**.img.gz' --exclude='*'

在本例中,这包括特定目录、其子目录以及所需的文件。如果源树中有大量您希望避免搜索的其他目录,则需要此变体。

答案3

扩展@Freddy 接受的答案

我的源目录和目标目录:

openWrtPath="/mnt/usb/openwrt/"  
ncpPath="/media/myCloudDrive/openwrt"

我的目标是仅同步源目录中名为 BackupOfSettings 的子文件夹中扩展名为 .tar.gz 的文件。 BackupOfSettings 子文件夹中的子文件夹也会被忽略。

这是问题中命令的简化版本。信用这里这里有关 rsync 如何从特定子目录同步特定文件类型的说明。

rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='*' $openWrtPath ncp:$ncpPath
  1. 要使用 rsync 实现此目的,您需要首先包含包含所需文件的子目录:--include='BackupOfSettings/'
  2. 然后,在单独的包含文件中,您需要在同一子目录中定义一个与您所需的文件类型匹配的模式:--include='BackupOfSettings/*.tar.gz'
  3. 然后您需要使用以下命令排除其他所有内容:--exclude='*'匹配并排除文件未明确包含的文件夹。

--exclude='/*'--exclude='*'

rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='/*' $openWrtPath ncp:$ncpPath

如果我们使用--exclude='/*',则上述命令将允许 BackupOfSettings 子文件夹中的所有文件,因为此排除仅匹配源目录中的文件和子文件夹...它不匹配文件在源目录的子文件夹中。

相关内容