目前我只对Directories
进行RSync,如下所示:
* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html
那么我如何rsync
一个像/var/www/public_html/.htaccess
这样的文件呢?
使用与创建目录相同的方法,但指定文件名的完整路径作为源。在您的示例中:
rsync -avz --status=progress /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/
正如评论中所提到的:由于-a
包含recurse,一个小的拼写错误就可以启动完整的目录树传输,因此更愚蠢的方法可能只是使用-vz
,或者用-lptgoD
替换它。
基本语法
rsync options source destination
示例
rsync -az /var/www/public_html/filename root@<remote-ip>:/var/www/public_html
阅读更多
但是,如果你想用这个源路径同步一个文件:
/source root/a/b/file
到具有以下目标路径的文件:
/target-root/a/b/file
目录a和b不存在?
您需要运行一个rsync命令,如下所示:
rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]
到目前为止,其中两个答案不太正确,他们会得到多个文件,而另一个并没有想象中那么简单,下面是一个更简单的答案IMO.
下面只得到一个文件,但您必须使用mkdir创建dest目录。这可能是最快的选择:
mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/
如果在/remote/path中只有一个文件实例,那么如果执行以下操作,rsync可以为您创建目录。这可能需要更多的时间,因为它会搜索更多的目录。此外,它将为/remote/path中不在中的目录创建空目录/本地
cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .
请记住,include和exclude的顺序很重要。
除了上面的好答案之外,rsync还希望目标是目录,而不是filename。假设您正在将单词列表文件words
复制到/tmp,不要这样做:
rsync -az /user/share/dict/words /tmp/words # does not work
"cp"可以容忍这种形式,但rsync不能——它会失败,因为它在/tmp/words
上看不到目录。剪下目标文件名,它工作:
rsync -az /user/share/dict/words /tmp
请注意,rsync不会允许您在复制过程中更改文件名,而cp会。