![rsync 中的 include="*" 是否复制所有子目录中的所有隐藏文件?](https://linux22.com/image/136650/rsync%20%E4%B8%AD%E7%9A%84%20include%3D%22*%22%20%E6%98%AF%E5%90%A6%E5%A4%8D%E5%88%B6%E6%89%80%E6%9C%89%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想备份包含数千个子目录和深层子文件夹路径的目录。在许多这样的目录中,有大量以.
.我想确保.
子目录和子子目录等中的所有文件都得到正确复制。指定就足够了吗include="*"
?这会涵盖一切吗?
rsync -rvh --compress-level=0 --stats --progress --include ".*" user@vm:/mnt/storage8/backups ~/data/backup_of_backups/
答案1
默认情况下包含所有文件,因此如果要包含所有文件,请不要传递任何--include
或--exclude
选项。
如果您确实使用模式,rsync 不会特殊对待点文件。如果您想跳过点文件,则必须显式使用--exclude='.*'
.
请注意,这只--include='.*'
包含点文件。这是一个 shell 模式,其中.
代表其自身并*
表示“任何字符序列”,而不是正则表达式,其中.
表示“任何字符”并*
表示“任意数量的前面的字符或组”。如果没有任何排除指令,您仍然可以获得所有文件,因此包含指令毫无意义,但如果您有一些排除指令,则--include='.*'
并不意味着“包含包括点文件在内的所有文件”,它仅意味着“包含点文件”(并且它本身不会递归到名称不以点开头的目录)。
答案2
没有指定任何包含或排除模式,rsync
将复制隐藏文件和目录。
rsync --stats --progress -av user@vm:/mnt/storage8/backups ~/data/backup_of_backups/
答案3
使用shopt -s dotglob
。它包括点文件。这是一个 bash 设置,因此也会修复mv
命令。
https://unix.stackexchange.com/a/446353/346155
编辑:接受的答案正确地说 rsync 默认情况下包含点文件。由于这个问题是 Google 对“rsync 点文件”的最高结果,因此我的 rsync 命令失败了。尽管OP没有尝试使用普通的rsync,但我经常在斜杠后面加一个星号,将其添加到目录末尾以确保目录不会被复制进入目标目录,当假设 rsync 中的“同步”实际上会同步目录时会发生这种情况。因此,就我而言,使用 dotglob 的 shell 选项解决了我的问题,也可能解决您的问题。它也适用于其他/dir/*
类型的通配符匹配。就我个人而言,我认为这比仅使用 / 更直观和明确,因为这/dir/
可能意味着仅完成一长串目录分隔符,因为它在与目标目录一起使用时被解释。
此外,我想知道默认情况下使用此 shell 选项是否会产生任何有害的副作用,因为默认情况下 Bash 中并未强加该选项。我认为这只是 Unix 设计的一部分,默认情况下不应复制或移动隐藏文件(再次强调,除非使用表单/dir/
)。我主张将所有文件复制为默认值,因为这似乎更直观和预期,除非我遗漏了有害的原因(我唯一能想到的是拥有人们不想移动的位置特定信息,或者只是想要从目录复制媒体数据而不是任何配置文件 - 我可能认为复制比不复制更好)。