Tar 通过管道传输到 split 通过管道传输到 scp

Tar 通过管道传输到 split 通过管道传输到 scp

所以我尝试通过 SCP 传输一堆文件。其中一些文件太大而无法存储在收件人上(Android 手机,4GB 文件大小限制)。

发送者几乎没有空间,所以我无法在本地创建中间文件。

我想将这些数据打包并通过 split 进行流式传输,以便获得手机可以接受的更小的片段,即本地命令:

tar -cvf - ~/batch/ | split --bytes=1024m - batch.tar.seg

但我不确定如何将其通过管道传输到 scp 中以将其发送到手机。根据评论这个帖子,这是可能的,但首先我不太明白他在说什么,其次我不确定如何实现这一点,因为 split 会输出多个文件。

有任何想法吗?

答案1

如果收件人有split,那么您可以执行以下操作:

tar -cvf - ~/batch/ | gzip |
  ssh recipient 'cd /destination &&
    split --bytes=1024m - batch.tar.gz.seg'

答案2

虽然您提到的评论确实指的是从 STDIN 读取 scp 和 ssh,但这并不完全是您的情况。原因是split:它不写入 STDOUT。因此,即使添加更多管道,也不会在那里获取数据。 Stephane 在上面的回答中提出了正确的建议:不要在源上存储任何内容,因为它缺乏可用空间,只需打包、gzip 并传输数据;然后在接收端进行分割,其中块大小很重要。

答案3

您引用的帖子很好地描述了该问题:当您使用管道时,您不会复制文件,而是重定向标准流。这scp不是正确的工具(它用于复制文件),ssh而是正确的程序:您将流重定向到ssh标准输入,这会将输入输出到远程主机并将其提供给指定命令的标准输入:

local$ tar -cvzf - ~/batch/ | ssh target 'split --bytes=1024m - batch.tar.seg'

请注意,我将压缩标志“z”添加到 tar 选项中,也许根本不需要拆分。

相关内容