我有 500 万个文件,占用了大约 1TB 的存储空间。我需要将这些文件传输给第三方。
最好的方法是什么?我尝试使用 .tar.gz 减小大小,但即使我的计算机有 8GB RAM,我也会收到“系统内存不足”错误。
通过蜗牛邮件发送文件是最好的解决方案吗?
答案1
注释中提供的附加信息表明 OP 正在使用 GUI 方法来创建文件.tar.gz
。
GUI 软件通常比等效的命令行等效软件包含更多的臃肿内容,或者为了某些“额外”功能(例如进度条)而执行额外的不必要的任务。如果 GUI 软件试图收集内存中所有文件名的列表,我不会感到惊讶。没有必要为了创建档案而这样做。专用工具绝对tar
是gzip
为处理流输入和输出而设计的,这意味着它们可以处理比内存大得多的输入和输出。
如果您避免使用 GUI 程序,您很可能可以使用完全正常的日常tar
调用来生成此存档,如下所示:
tar czf foo.tar.gz foo
其中foo
是包含所有 500 万个文件的目录。
这个问题的其他答案为您提供了一些额外的替代tar
命令来尝试,以防您想将结果分成多个部分等......
答案2
“五百万”个文件,总共 1TB?那么你的文件一定非常小。我只想尝试rsync
:
rsync -alPEmivvz /source/dir remote.host.tld:/base/dir
如果您没有,或者您的用例不允许使用rsync
,我至少会检查是否7z
适用于您的数据。可能不会,但我认为仍然值得一试:
7z a archive.7z /source/dir
或者,如果您觉得不舒服,7z
至少尝试制作一个.tar.xz
存档:
tar cJv archive.tar.xz /source/dir
(应该注意的是,旧版本的tar
不创建.tar.xz
档案,而是.tar.lzma
在使用开关时创建档案J
。即使是旧版本的tar
,也不J
完全支持该标志。)
由于您使用 GUI 程序来创建这些文件,我假设您对使用命令行界面感到有点不舒服。
为了方便从命令行界面创建、管理和提取档案,有一个名为的小实用程序atool
。它几乎适用于我见过的每一个常见发行版,并且几乎适用于我偶然发现的每一个档案,除非那些极其晦涩难懂的档案。
当它位于工作环境中时,检查您的发行版是否已atool
在其存储库中,或要求您的管理员安装它。
atool
为其自身安装一堆符号链接,因此打包和解包变得轻而易举:
apack archive.tar.xz <files and/or directories>
创建档案。
aunpack archive.7z
扩展档案。
als archive.rar
列出文件内容。
创建什么样的存档,可以atool
通过命令行中存档的文件扩展名来识别。
答案3
除非您能做到比 25:1 更好的压缩,否则您不太可能在邮寄之前通过压缩获得任何好处,除非您有某种可以与第三方交换的硬件磁带格式。
最大的常见存储是蓝光,大约可以提供 40Gb。您需要对数据进行 25 比 1 的压缩才能使其适合该数据。如果您的第三方只有 DVD,您需要 125:1(大约)。
如果您无法匹配这些压缩数字,只需使用普通光盘,将其复制并邮寄给第三方。在这种情况下,运输小于 1Tb 驱动器且需要压缩的东西是疯狂的。
您只需将其与使用ssh -C
(标准压缩)或最好rsync
使用压缩进行比较即可通过网络复制文件,无需预先压缩和 tar。 1Tb通过网络传输并不是不可能,但是需要一段时间。
答案4
7z是我的选择。它允许自动分割档案并支持多线程压缩。不,xz
不,不管帮助消息怎么说。尝试使用:
7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/
输出被分成 100MB 块(用开关更改-v
)。
唯一真正的缺点是 7z 不保留 unix 元数据(例如权限和所有者)。如果您需要,请tar
通过管道输出7za
(请参阅man 7za
一些示例)。