这是我的源目录结构:
../openwrt
../openwrt/BackupOfPackages
../openwrt/BackupOfSettings
../openwrt/BackupOfImages
我想使用 rsync 将其镜像到目标目录。我只想rsync三个子目录中的文件,并且只想同步扩展名为:
.installed
from thefolderfromthefolderfromthefolder的BackupOfPackages
文件
.img.gz
BackupOfImages
.tar.gz
BackupOfSettings
在我的源目录中,我在 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 命令以仅复制扩展名为:
.installed
到BackupOfPackages
文件夹
.img.gz
到BackupOfImages
文件夹
.tar.gz
到BackupOfSettings
文件夹
即:正确隐藏不应从各个子目录传输到目标的任何文件类型,即使它们存在于源计算机上的这些子目录中。
更新
在我发布后,我想我找到了答案..当我更改--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
- 要使用 rsync 实现此目的,您需要首先包含包含所需文件的子目录:
--include='BackupOfSettings/'
- 然后,在单独的包含文件中,您需要在同一子目录中定义一个与您所需的文件类型匹配的模式:
--include='BackupOfSettings/*.tar.gz'
- 然后您需要使用以下命令排除其他所有内容:
--exclude='*'
匹配并排除文件和未明确包含的文件夹。
--exclude='/*'
与--exclude='*'
rsync -vvritn --include='BackupOfSettings/' --include='BackupOfSettings/*.tar.gz' --exclude='/*' $openWrtPath ncp:$ncpPath
如果我们使用--exclude='/*'
,则上述命令将允许 BackupOfSettings 子文件夹中的所有文件,因为此排除仅匹配源目录中的文件和子文件夹...它不匹配文件在源目录的子文件夹中。