我们有几个大于 2GB 的文件,使用 UNIX 版本的 tar 命令(SunOS 5.5,上次更改时间:1995 年!)进行打包。对于大于 2GB 的 tar 文件,有一个“E”标志。这是如何完成的:
rsh sun_server tar cvEf - abc/file1 abc/file2 | rsh archive_server archive_cmd
请注意,archive_server 也是一个 UNIX 服务器,并使用相同版本的 tar 命令。
在检索时,我们这样做:
cd /destination_path/
rsh archive_server retrieve_cmd | tar xvf -
发生的情况是文件被提取到 /abc/(在父目录中);而不是在 /destination_path/abc/
奇怪的是我们将检索方法改为 gtar:
cd /destination_path/
rsh archive_server retrieve_cmd | gtar xvf -
对于大于 2GB 的文件,最后会出现许多“坏头”和“内存耗尽”错误。 但是,对于小于 2GB 的文件,它们会正常提取到 /目标路径/abc/!
我们需要将 >2GB 的文件提取到 /destination_path/abc/,因为 /abc/ 下有许多同名的文件,我们担心提取的文件会覆盖它们。
我也试过
rsh archive_server retrieve_cmd | tar xvf - /destination_path/
和
cd /destination_path/
rsh archive_server retrieve_cmd | tar xvf - .
但结果是:没有结果!这表明提取已成功完成,但 /abc/ 和 /destination_path/ 中均未提取任何文件!
有没有办法将这些文件提取到所需的目标路径?
答案1
rsh 比 ssh 快,但我更喜欢 ssh。用 rsh 替代 ssh 应该可以。
gtar -cf - 文件 | ssh 用户@主机“(cd /destPath; gtar -xf -)”
这里的关键是用括号括起来。
答案2
一个想法,您可以使用命令 split 将 tar 存档分成几部分....例如,考虑类似以下操作:
tar cf - <dirspec> | split --bytes=1GB <destdir>/archive.
目标可以是 NFS 挂载文件系统。或者,如果您愿意,也可以从本地源发送它们,然后同时运行多个远程复制命令。
然后,您可以随时在目标位置解压该文件,使用以下命令:
cd <destdir>
cat archive.* | tar xf -
在网络上,我对传输这么长的连续字节流(取决于距离)有点担心。无论如何,较小的段传输可能更可取,以便更容易从网络故障中恢复。
为了使文件更小,您可以根据您所能承受的 CPU 时间添加 gzip/gunzip。
答案3
您需要在两边都使用 GNU 的 tar (gtar)。Solaris 的 tar 会悄悄破坏大于 2GB 的文件。此外,它还会悄悄破坏文件名较长的文件。
答案4
上述几个答案都可以,但是,请查看 pax。它被认为是 tar 和 cpio 的替代品,可能会更优雅地处理工作。大多数人没有采用该工具,因为该工具非常受欢迎,但它实际上非常好。
韓國