我需要通过 ssh 将文件传输到另一台服务器。两边的文件结构相同。我使用了 scp -r,但它不会保留原始文件/目录权限。rsync 可以保持权限不变,但如果我想因为更改而覆盖目标端的文件,它不会删除目标端的文件。我知道 rsync 会在源文件较新时写入更改,但我需要它复制所有内容,而不管日期如何(即用我要移动的目录替换目标目录),而不必先进入目标并手动删除目录。
我听说 tar 可以做到这一点,但我似乎无法让它正常工作。语法是
tar -cf - /directory/directory | ssh host.name tar -xf - C /destination_directory
任何帮助,将不胜感激。
答案1
rsync 可以使用 --delete 语法删除目标上的文件。如果您希望它完全覆盖文件而不是部分同步实现,请尝试 --whole-file。
摘录自http://www.samba.org/ftp/rsync/rsync.html:
-W, --whole-file 使用此选项时,不使用 rsync 的增量传输算法,而是按原样发送整个文件。当源计算机和目标计算机之间的带宽高于磁盘带宽时(尤其是当“磁盘”实际上是网络文件系统时),如果使用此选项,传输可能会更快。当源计算机和目标计算机都指定为本地路径时,这是默认设置,但前提是没有批量写入选项生效。
--delete 这会告诉 rsync 从接收端删除无关文件(不在发送端的文件),但仅限于正在同步的目录。您必须要求 rsync 发送整个目录(例如“dir”或“dir/”),而不使用通配符来表示目录的内容(例如“dir/*”),因为通配符由 shell 扩展,因此 rsync 会收到传输单个文件的请求,而不是文件的父目录。除非您使用 --delete-excluded 选项或将规则标记为仅在发送端匹配(请参阅 FILTER RULES 部分中的 include/exclude 修饰符),否则从传输中排除的文件也不会被删除。
答案2
正如 Eddie 指出的那样,rsync --delete -Ha
它将为您完成这项工作。请确保在实际运行它之前使用--dry-run
/-n
选项,以避免意外删除错误目录中的所有内容。Rsync 会根据您是否附加尾部斜杠来以不同的方式解释您的目录(请参阅man rsync
并搜索“trailing”),所以如果不注意的话很容易出错。
我有时也会像你一样使用 tar。我认为你只是在C
上面的命令中漏掉了一个破折号。根据经验,你只能省略第一个参数中的破折号。(但你也可以使用cd
而不是笨拙的语法-C
。)使用tar
源端的,你会directory/
在存档中的路径名中创建一个额外的前导,所以我也会cd
在源端使用 first。-f -
顺便说一下,是多余的(tar 默认使用 stdin/stdout)。所以,我的管道 tar 看起来往往是这样的:
cd /some/dir; tar c my_dir | ssh host 'cd /the/target/dir; rm -rf my_dir; tar x'
sudo tar
在主机端使用以在提取时保留所有权。(提示:使用cz
/xz
代替c
/x
进行 gzip 压缩传输,或通过管道lzop
和lzop -d
进行实时压缩(如果您通过以太网电缆传输)。)