我正在寻找使用 bsdtar 在 2 个 Linux 服务器之间复制文件的最快方法。
对于普通的 tar,我会做类似的事情:
ssh root@remote 'tar -cz -C /my/path/ big_file.txt' | tar -zxv
然而,仅仅将“tar”替换为“bsdtar”似乎不起作用。
所以,我的问题是:
- 我该如何使用 bsdtar 做到这一点?
- 我不想使用 gzip,而是想使用可以使用多个内核进行压缩/解压缩的东西,例如 pbzip2。我该如何将其输入?
- 我希望文件“big_file.txt”在目标服务器上被称为“hello_world.txt”,而不使用重命名的临时文件。如何?
更新1:
我自己解决了第一个问题:
ssh root@localhost 'bsdtar -cz -f - -C /my/path/ big_file.txt' | tar -zxv
更新2:
我自己解决了第三个问题:
ssh root@localhost 'bsdtar -cz -f - -C /my/path/ big_file.txt' | tar -zxv -O > test.txt
答案1
该命令的语法有许多变化tar
。 GNU tar 默认在标准输入上读取存档并将存档写入标准输出,但许多其他版本默认使用磁带设备。传递f
标志(带或不带破折号——我认为 BSD 版本都支持)和参数-
来指示 stdin 或 stdout。
如果您想使用不同的(解)压缩程序,请不要告诉tar
压缩,并显式地通过管道输入(解)压缩程序。
要重命名文件,请使用-s
选项(如果您的版本tar
支持)(它类似于GNU tar 的-s
选项pax
和 选项)。--transform
ssh root@remote 'cd /my/path && bsdtar cf - -s '/big_file\.txt$/hello.txt/' big_file.txt | pbzip2' | pbzip2 -d | tar xf -
如果您只复制单个文件,则使用 tar 没有任何意义,除非您既想保留元数据又想使用自定义压缩程序。
scp -C -p root@remote:/my/path/hello.txt big_file.txt