我想对文件进行 gzip 压缩,然后立即将其 rsync 到另一台服务器,这样创建的 gzip 文件就不会写入本地服务器。我曾想过这样做……但显然会失败。
gzip 文件 | rsync -auv another_server
有人知道吗?或者这有可能吗?
答案1
我通常的方法是使用 gzip 和 ssh,如下所示:
gzip -c 文件|ssh[电子邮件保护]“cat > 目的地.gz”
这会将 zip 输出通过 ssh 直接发送到远程主机上的文件“destination.gz”。如果您手动执行此操作,只需输入您的 ssh 密码;如果您想自动执行此操作,您需要设置 ssh 密钥,如下所示:
答案2
别介意,但从你的问题和评论来看,你似乎不明白 rsync 到底是什么为了. 它不是用来将文件从一个地方移动到另一个地方的——而是用来同步在两个地方之间传输文件。如果您不想在本地机器上保留副本,则您没有进行同步,rsync 也不是您想要的工具。
您正在尝试传输文件。为此,您可以将其放在磁盘上并使用 ssh、ftp、sftp、ftps 等,或者您可以按照 Glenn 的建议通过 ssh 进行管道传输,这是正确的答案,也是做您想做的事情的唯一正确方法。如果您担心资源利用率(对于高带宽连接,这可能会有所不同),请更改密码:
gzip -c somefile | ssh -c blowfish user@host 'cat > someotherfile'
如果您尝试执行某项操作(例如管道到 rsync)但无法正常工作,则可能是您操作错误,也可能是您在尝试做错事。这是一个工具问题,重要的是不要排除无论您尝试执行什么操作,都有合适的工具。
理解并牢记 UNIX 环境中各种不同工具的用途将使您能够更有效地使用和操作该环境。许多工具在功能上存在细微差异或重叠,但除非您全部注意它们,否则您将错过许多完成任务的最佳方法。
答案3
在这种情况下,Rsync 可能不会带来任何好处,因为它发送的内容是唯一的。
压缩文件并将输出发送到 STDOUT 非常简单:
gzip -c file > another-file
如果您追求速度,并且能够控制两端,netcat 几乎没有开销。
设置目标机器监听 1234 端口
user@bar$ nc -l -p 1234 > file.gz
发送‘file.gz’到机器 bar:1234
user@foo$ gzip -c file | nc bar 1234
答案4
结合 gzip 和 rsync 不起作用。
如果您发送未压缩的文件,那么 rsync 会只发送已更改的位。但是当您使用 gzip 压缩文件时,每次生成的文件都会有很大不同。将其传输到 rsync 最多只能实现与 ssh 类似的结果,甚至可能更糟。
压缩文件每次都不同的原因是它在压缩之前会分析数据。这意味着即使文件中的一个小变化也会导致分析结果发生变化,从而影响压缩的每个字节。