仅 rsync 某些目录以及其中的某些子目录

仅 rsync 某些目录以及其中的某些子目录

/opt有许多不同的目录,其中一些目录的名称中间包含_pkg_linux_deb_或。这些目录还包含许多子目录,其中一个子目录又包含自己的子目录。我希望这些子目录中的文件被 rsync,保留整个目录结构,例如_pkg_android_apk_lastSuccessfularchivearchivefoo_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/…没什么区别)

相关内容