我正在编写一个脚本,用于使用 rsync 从 server-a 到 server-b 自动复制文件,这是我的脚本:
#!/bin/bash
NOW=$(date +"%Y-%m")
rsync -au --ignore-existing /var/www/uploads/$NOW/* -e root@1.1.2.2:/var/www/uploads/$NOW/.
Run Code Online (Sandbox Code Playgroud)
当我们下个月(例如从 10 月到 11 月)时,我的脚本出现此错误:
`
rsync: mkdir "/var/www/uploads/2014-11/." failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(605) [Receiver=3.0.9]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
Run Code Online (Sandbox Code Playgroud)
`我应该如何解决这个错误?请帮我
首先,确保目标上的父目录存在。即root@1.1.2.2:/var/www/uploads应该存在。我认为根据您的表述,尾随.指的是 rsync 尝试创建的目录,除非父目录已经存在,否则它不能这样做。即父母是root@1.1.2.2:/var/www/uploads/$NOW。
其次,要意识到 rsync 的行为与 cp 以各种方式略有不同,文件名的尾随 '/' 。我发现最安全和最直观的方法是/在所有目录的末尾使用尾随。像这样:
rsync -au --ignore-existing /var/www/uploads/$NOW/ -e root@1.1.2.2:/var/www/uploads/$NOW/
Run Code Online (Sandbox Code Playgroud)
与 cp 不同,rsync 会可靠地将 source 参数中的目录内容复制到目标目录的内容,如有必要,创建目标目录(尽管它的父目录必须存在),而不是将源目录(即父目录)放入其中如果目标已经存在,则为目标目录。
这与您所做的略有不同,因为您这样做的方式会排除名称以.源目录开头的文件,并且如果复制的文件列表太长则会失败(bash 扩展上限为总数如果没记错的话,命令行长度约为 32K 个字符)。
小智 2
需要删除尾随点,将脚本更改为:
rsync -au --ignore-existing /var/www/uploads/$NOW/* -e root@1.1.2.2:/var/www/uploads/$NOW
Run Code Online (Sandbox Code Playgroud)