Bash 将stdin作为另一个文件添加到tar存档
我正在尝试从程序输出向tar归档添加一个文件,而不首先在磁盘上生成它。设想一个文件Bash 将stdin作为另一个文件添加到tar存档,bash,deployment,pipe,tar,Bash,Deployment,Pipe,Tar,我正在尝试从程序输出向tar归档添加一个文件,而不首先在磁盘上生成它。设想一个文件版本,它是在构建脚本运行时自动生成的。我尝试了此操作,但取消引用的符号链接只是一个命名管道,不是常规文件: $ date +%s | \ tar cf test.tar \ --dereference \ --transform="s#/proc/self/fd/0#VERSION#" \ /proc/self/fd/0 \ other_files \ and_folde
版本
,它是在构建脚本运行时自动生成的。我尝试了此操作,但取消引用的符号链接只是一个命名管道,不是常规文件:
$ date +%s | \
tar cf test.tar \
--dereference \
--transform="s#/proc/self/fd/0#VERSION#" \
/proc/self/fd/0 \
other_files \
and_folders/
结果应该是一个文件版本
,在tar存档中有一个时间戳,不在本地生成文件:
$ tar tf test.tar
VERSION
other_files
and_folders
我不知道如何在JAR存档中创建一个“假”文件条目。我会创建一个普通文件,将其添加到存档中,然后删除它
不过,您可能需要尝试选项
-A
(或-串联
)。这将允许您在/tmp
中创建文件,将其添加到TAR归档,然后在第二步中附加其余文件。通过这种方式,您可以为版本文件创建任意路径。虽然tar
确实适用于文件,但这并不意味着您必须自己创建临时文件,我建议您不要这样做
您可以使用进程替换(Bash支持这一点,Fish在a中也支持)
tar cvaf a.tgz谢谢!我现在就是这么做的。执行mktemp
,使用--transform=s/tempfile/VERSION/
将其添加到存档中,然后删除。我只是希望通过某种管道魔法使这一步更加简洁。这是唯一的方法,因为你不能通过管道给TAR文件名和内容/proc/self/fd/0
不起作用,因为tar
将链接归档为特殊文件,而不是扩展其内容。我还感到惊讶的是,在这种情况下,--dereference
并没有关闭它。好吧,--dereference
确实有一个效果:如果没有,打包的/proc/self/fd/0
仍然是一个符号链接,它是一个命名管道(类型是ls-F
附加了
)。但是打包管道的用途有限……这与我的/proc
解决方案遇到的问题相同:tar
打包管道,而不是普通文件。在解包时,它会显示:$cat VERSION\ncat:VERSION:未找到文件或文件夹
@Boldewyn这在shell中往往是不同的。Fish使用mkfifo
(例如/tmp/.psub.O02RnmHZ5g
)创建实际命名管道,并且建议的方法可以完美地工作。Bash使用了一些神奇的文件,如/dev/fd/63
。不幸的是,对于Bash中的进程替换,似乎没有内置的方法切换到mkfifo
。很有趣!好的,那确实有效,但我一定要在这里痛击。
tar cvaf a.tgz <(echo 1.0.0) file1 file2 -P --transform 's:^/.*:VERSION:'