使用 linux ssh 进行传输并维护权限

使用 linux ssh 进行传输并维护权限

我需要通过 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 压缩传输,或通过管道lzoplzop -d进行实时压缩(如果您通过以太网电缆传输)。)

相关内容