所以我尝试通过 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 选项中,也许根本不需要拆分。