我有一个目录,其中有几千兆字节和几千个小文件。我想用 scp 通过网络多次复制它。源计算机和目标计算机上的 CPU 时间很便宜,但单独复制每个文件所增加的网络开销是巨大的。我会将其 tar/gzip 起来并将其运送过来,但源计算机的磁盘空间不足。
有没有办法让我通过管道将输出传送tar -czf <output> <directory>
到 scp ?如果没有,还有其他简单的解决方案吗?我的源机器很古老(SunOS),所以我不想在上面安装东西。
答案1
您可以通过 ssh 会话通过管道传输 tar:
$ tar czf - <files> | ssh user@host "cd /wherever && tar xvzf -"
答案2
使用 bzip2 压缩的 Tar 应减轻网络和 CPU 上的负载。
$ tar -C /path/to/src/dir -jcf - ./ | ssh user@server 'tar -C /path/to/dest/dir -jxf -'
不使用,-v
因为屏幕输出可能会减慢该过程。但如果您想要详细输出,请在 tar ( -jcvf
) 的本地端使用它,而不是在远程部分。
如果您重复复制同一目标路径(例如更新备份副本),则最佳选择是带压缩的 rsync。
$ rsync -az -e ssh /path/to/src/dir/ user@server:/path/to/dest/dir/
请注意,src 和 dest 路径均以 / 结尾。再次强调,不要故意使用-v
和-P
标志,如果需要详细输出,请添加它们。
答案3
使用rsync
,它使用 SSH。
用法:
rsync -aPz /source/path destination.server:remote/path
rsync 开关关心压缩和 I-Node 信息。-P
显示每个文件的进度。
您可以使用scp -C
,这会启用压缩,但如果可能,请使用rsync
。
答案4
或者,如果需要,您也可以以相反的方式进行。这就是通过网络拉出 tarball,而不是像建议的那样推送它。这并不能解决您问题的重复部分,而 rsync 是最好的选择,但可能有 tar 开关可以提供帮助。
所以在本地机器上:
ssh remote 'tar zcf - /etc/resolv.conf' | tar zxf -
最好先进入正确的目录,否则必须在最后使用-C
un ing 命令上的开关。tar
只是在需要时提及这一点。这对我来说是因为在我的情况下,我的本地服务器位于 nat 之后,因此需要一些网络测试才能按照前面提到的方式做到这一点。