使用 rsync -r 命令包含点文件 (.x)

使用 rsync -r 命令包含点文件 (.x)

我有以下命令:

rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot"/* "/home/node/.docker_r2g_cache/b640e7fd-27a7-4dd8-8ca8-5363a1c59c35"

我刚刚意识到使用 /* 不会复制点文件(以 . 开头的文件/文件夹)...

有人知道我如何包含这些文件吗?

我认为最好的方法是放弃 /* 符号并只使用

rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot" "/home/node/.docker_r2g_cache/b640e7fd-27a7-4dd8-8ca8-5363a1c59c35"

但还有别的办法吗?

答案1

最好将模式匹配留给 rsync,这样您就不会依赖于当时 shell 具有的任何 shell 和选项。

当你这样做时:

rsync -a /some/dir/* host:/remote/dir/

那么你实际上要求 shell 扩展该/some/dir/*部分,以便 rsync 实际上像这样执行:

rsync -a /some/dir/adir /some/dir/afile /some/dir/anotherfile [etc] host:/remote/dir/

这通常与意图非常相似,但并不总是像提出这个问题的事实所证明的那样。因此最好执行:

rsync -a /some/dir/ host:/remote/dir/

现在 rsync 将(因为它是递归的-a缩写)递归地遍历目录并将其所有内容同步到远程主机上,包括直接在.-rlptgoD-r/some/dir/remote/dir/some/dir

由于源路径以斜杠结尾/,因此传输的文件名会忽略源位置的任何部分。如果/some/dir通过了,那么您就是在告诉显式同步dir目录,包括其名称。建议养成始终添加最后一个斜杠的习惯,以避免这种混乱,除非您真正了解发生了什么。

答案2

我认为最好的是使用存档模式(-a),手册页对此有说明:“这相当于 -rlptgoD。这是一种快速的方式来表示您想要递归并想要保留几乎所有内容(-H 是显着遗漏)。”:

rsync -a /source/path/ /destination/path/
  • 始终使用结尾斜杠 /
  • 不要使用 *,因为它不包含点文件
  • 如果通过比磁盘读/写慢的网络传输,请考虑压缩 -z

答案3

如果这是 bash 你可以设置dotglob

shopt -s dotglob

.这与或不匹配..(与 相反.*)。

因此可以使用相同的命令:

rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot"/* ...

相关内容