我正在尝试将server1的目录A与server2的目录B进行rsync。
我坐在server1的目录A中,运行了以下命令。
rsync -av * server2::sharename/B
但有趣的是,它同步了除.htaccess或目录A中任何隐藏文件外的所有文件和目录。子目录中的任何隐藏文件都会同步。
我还尝试了以下命令:
rsync -av --include=".htaccess" * server2::sharename/B
但是结果是一样的。
为什么A目录的隐藏文件没有同步以及如何修复它的想法。我以root用户身份运行。
感谢
这是因为默认情况下,*
扩展到当前工作目录中的所有文件,但名称以句点开头的文件除外。因此,rsync
从不接收这些文件作为自变量。
您可以将表示当前工作目录的.
传递给rsync
:
rsync -av . server2::sharename/B
通过这种方式,rsync
将在当前工作目录中查找要传输的文件,而不是在*
扩展到的目录中查找文件。
或者,您可以使用以下命令使*
扩展到所有文件,包括以句点开头的文件:
shopt -s dotglob
另请参阅shopt手册页。
对于任何试图在服务器之间同步目录(包括所有隐藏文件)的人,例如,将source-server
上的somedirA
同步到目标服务器上的somedirB
,请尝试此:
rsync -avz -e ssh --progress user@source-server:/somedirA/ somedirB/
注意两条路径末尾的斜杠任何其他语法都可能导致意外结果!
此外,对我来说,从目标服务器执行rsync
命令是最容易的,因为它更容易确保我有适当的写访问权限(即,我可能需要将sudo
添加到上面的命令中)。
可能不用说,但很明显,您的远程用户也需要对源服务器上的somedirA
进行读取访问。:)
我遇到了同样的问题。
对我来说,当我执行以下命令时,隐藏文件确实而不是获得rsync'ed
rsync -av /home/user1 server02:/home/user1
但当我在路径的末尾添加斜杠时,隐藏的文件是rsync'ed。
rsync -av /home/user1/ server02:/home/user1/
注意路径末尾的斜杠,正如Brian Lacy所说,斜杠是关键。我没有资格对他的帖子发表评论,否则我会这么做的。
我认为问题是由于shell通配符扩展引起的。使用而不是星星。
考虑以下目录内容示例
$ ls -a .
. .. .htaccess a.html z.js
shell的通配符扩展转换rsync程序从获得的参数列表
-av * server2::sharename/B
进入
-av a.html z.js server2::sharename/B
在命令开始执行之前。
*
通知rsynch不要同步隐藏文件。您不应该忽略它。
在一个相关的注意事项中,如果有来自谷歌等公司的人试图在rsync
没有复制隐藏子文件夹的情况下找到,我发现了发生这种情况的另一个原因,并认为我会为下一个遇到同样情况的人支付这笔钱:如果你使用-C
选项(显然--exclude
也会这样做,但我认为它更容易发现)。
在我的案例中,我有一个脚本,它在计算机上复制了几个文件夹,包括一个包含几个git项目的目录,我注意到我无法在复制的repo中运行任何正常的git
命令(是的,通常应该使用git clone
,但这是包含其他内容的更大备份的一部分)。看了这个脚本后,我发现它调用rsync
,有7或8个选项。
在谷歌搜索没有找到任何明显的答案后,我开始一个接一个地检查开关。删除-C
选项后,它工作正常。在脚本的情况下,-C
标志似乎是错误添加的,可能是因为最初使用的是sftp
,而-C
是该工具下与压缩相关的选项。
根据man rsync
,该选项被描述为
--cvs排除、-C自动忽略文件的方式与cvs执行的方式相同
由于CVS是一个旧版本的控制系统,并且给出了手册页的描述,所以它的行为方式是完全合理的。