Ubuntu 将大量(100万+;)文件从一台服务器移动到另一台服务器-';参数太多';

Ubuntu 将大量(100万+;)文件从一台服务器移动到另一台服务器-';参数太多';,ubuntu,gzip,rsync,tar,scp,Ubuntu,Gzip,Rsync,Tar,Scp,我需要将大量文件从一台服务器移动到另一台服务器。所有的文件都是图像,相当小,但总的来说是10GB+ 我曾尝试使用tar和gzip,但由于“参数太多”而失败 我怎样才能避开“争论太多”的问题 也许还有别的办法——SCP或rsync可以这样做吗 两个盒子都是Ubuntu 编辑 下面的代码似乎挂起了,什么也没有发生,在退出命令后,images.tar.gz文件的大小为零 tar -zcvf images.tar.gz images 尝试cpio,它从stdin读取文件列表。您可以通过ssh管道输出:

我需要将大量文件从一台服务器移动到另一台服务器。所有的文件都是图像,相当小,但总的来说是10GB+

我曾尝试使用tar和gzip,但由于“参数太多”而失败

我怎样才能避开“争论太多”的问题

也许还有别的办法——SCP或rsync可以这样做吗

两个盒子都是Ubuntu

编辑

下面的代码似乎挂起了,什么也没有发生,在退出命令后,images.tar.gz文件的大小为零

tar -zcvf images.tar.gz images

尝试
cpio
,它从
stdin
读取文件列表。您可以通过
ssh
管道输出:

find images -print0 | cpio -o0x ustar | ssh user@host cpio -i
还是压缩

find images -print0 | cpio -o0x ustar | gzip | ssh user@host 'gunzip  | cpio -i'
更新
实际上这是一个答案,因为GNU
cpio
只实现大小有限的归档格式。答案已更新为使用
ustar
格式,该格式超过默认格式的2 GiB限制,但仍然只有8 GiB。Mark Addler的
tar
答案可能是获取大量数据的最佳方式。

-T-
将从stdin读取文件名。因此,您可以执行以下操作:

find . -name \*.jpg -print0 | tar -zcvf images.tar.gz --null -T -
不过,正如我在评论中所指出的,我建议改为rsync


如注释中所述,
print0
使用空('\0')来终止文件名,
--null
供tar使用,以便接受带有空格和其他终止符的更通用的文件名。

您的使用*应该改为查看-r。*扩展到发布正在使用的命令行所需的所有文件。你刚才用过上面提到的地球仪吗?文件名来自哪里?是的,绝对是rsync。即使你把它都挂起来了,如果10 GB的传输在中间被弄乱了,你就需要从头再来。rsync将自动重试,并且易于重新启动。由于文件是图像,因此它们已经被压缩,并且不会从进一步压缩中受益。我建议直接在文件上使用rsync。@Mark:true,
rsync
在文件已经存在的情况下更好,尤其是在某些文件已经更改的情况下。但是,对于一次性传输来说,发送存档要快得多,尤其是当它包含大量文件时。如果失败,rsync可以一直使用。最好使用
print0
--null
选项与
tar
一起使用,这将处理任何文件名。我正在尝试,rsync不是一个简单的选项,因为我需要VPN(速度很慢)来ssh。这只是挂了很长一段时间-也许建立文件列表?让它做它的事情。要么这样,要么在更小的部分上运行它,这样您就可以看到它需要多长时间,并建立您对其运行的信心。是否有一种方法可以将它转移到后台进程,这样,如果VPN的管道断开,它仍然可以运行?然后我可以重新连接并检查文件大小,看看它是否完成了?这是使用rsync的巨大优势之一。如果进程或连接被中断,您只需重新启动rsync,它就会自己找出是什么造成的,什么没有造成的,然后从中断的地方重新开始。