我/opt
有许多不同的目录,其中一些目录的名称中间包含_pkg_linux_deb_
或。这些目录还包含许多子目录,其中一个子目录又包含自己的子目录。我希望这些子目录中的文件被 rsync,保留整个目录结构,例如_pkg_android_apk_
lastSuccessful
archive
archive
foo_pkg_linux_deb_bar/lastSuccessful/archive/dir1/dir2/dirN/foo.ext
这是我提出的规则,但它似乎不起作用:
rsync -rnvm --include='/*(_pkg_linux_deb_|_pkg_android_apk_)*/lastSuccessful/archive/***' --exclude='*' /opt/ dest/
下面使用 bash 的扩展,它确实有效,但目标不包含整个目录结构,它缺少*{_pkg_linux_deb_,_pkg_android_apk_}*/lastSuccessful/archive/
目录,只将内容archive/
放入dest/
rsync -rnvm /opt/*{_pkg_linux_deb_,_pkg_android_apk_}*/lastSuccessful/archive/ dest/
答案1
主要问题是,当 rsync 递归地遍历文件夹层次结构时,它只会进入符合其过滤规则的目录。因此,在您的第一个示例中,rsync 永远不会进入目录lastSuccessful
,因为规则排除了其上方的目录!
相反,你需要做这样的事情:
rsync -rnvm --include='/*_pkg_linux_deb_*/' --include='/*_pkg_android_apk_*/' --include='lastSuccessful/' --include='archive/***' --exclude='*' /opt/ dest/
答案2
我在谷歌搜索时发现了你的问题,因为我也遇到了同样的问题。对于某些pick
子文件夹,我使用过滤列表(更好的监督)
rsync -arzvi --include-from=/home/frank/filters.txt
在那里面,有点丑陋,但你必须......
- “打开”每个级别(就我而言,我不想要任何用户级别的隐藏目录,除了极少数......)
- 然后“擦除”你不需要的内容
片段:
+ home/*/.ssh/***
+ home/*/.config/
+ home/*/.config/plank/***
+ home/*/.config/dconf/***
+ home/*/.config/Code/
+ home/*/.config/Code/User/
+ home/*/.config/Code/User/*.json
# hide the rest ( .local, .wine, most of .config ...)
- home/*/.*/
# 'wipe' all the from above step-by-step subdirectories directories
- home/*/.*/***
(顺便说一下, home/…
vs./home/…
没什么区别)