如何管道:cp | tar | gzip 而不创建中间文件?

如何管道:cp | tar | gzip 而不创建中间文件?

有人能告诉我是否可以通过管道传输 | 而不需要在 A 和 B.tar.gz 之间的任何地方创建物理文件吗?

这就是我想做的事情:

  1. 文件A
  2. 将 A 重命名为 B
  3. 焦油B
  4. gzip -9 压缩文件

例如:

cp A B | tar cvf - B | gzip -9 B.tar.gz

答案1

可以使用以下示例来避免创建中间文件:

使用 gzip 压缩:

tar cf - A | gzip -9 > B.tar.gz

不使用 tar 的 gzip:

gzip -9c A > B.gz

不使用 gzip 的 tar:

tar cf B.tar A

重命名(移动)ABfirst 对我来说没有意义。如果这是有意为之,那么只需mv A B &&在上述任一命令之前放置一个,然后AB那里交换。

tar 和 gzip 的示例:

mv A B && tar cf - B | gzip -9 > B.tar.gz

答案2

这取决于你的 tar 版本

如果你有支持成员转换(--transform 或 --xform)的版本,那么你可以简单地执行

tar -c --transform=s/A/B/ A | gzip -9 > B.tar.gz

如果您的 tar 支持 -z 选项,则可以避免使用 | gzip -9 >B.tar.gz

tar -zcvf B.tar.gz --transform=s/A/B/ A

如果你的 tar 版本不支持 --transform 那么你必须先复制文件,例如

 cp A B && tar -zcvf B.tar.gz B

但是如果你只压缩一个文件,为什么不跳过 tar 部分,直接执行

cat A | gzip -9 > B.gz

答案3

如果您要使用cp不同的名称/位置来制作副本,则只需在创建完整的 .gzip 文件时包含所需的完整/最终路径名:

tar -cvf existing.file | gzip -1 > ./newdirectory/newnamed.file.tgz

相关内容