如何通过 scp 最好地复制大量小文件?

如何通过 scp 最好地复制大量小文件?

我有一个目录,其中有几千兆字节和几千个小文件。我想用 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 -

最好先进入正确的目录,否则必须在最后使用-Cun ing 命令上的开关。tar

只是在需要时提及这一点。这对我来说是因为在我的情况下,我的本地服务器位于 nat 之后,因此需要一些网络测试才能按照前面提到的方式做到这一点。

相关内容