将stdin作为另一个文件添加到tar存档中

时间:2014-11-24 14:39:40

标签: bash deployment pipe tar

我正在尝试从程序输出中将文件添加到tar存档,而不是先在磁盘上生成它。在构建脚本运行时,可以考虑自动生成的文件VERSION。我尝试了这个,但是解除引用的符号链接只是一个命名管道,而不是常规文件:

$ date +%s | \
  tar cf test.tar \
    --dereference \
    --transform="s#/proc/self/fd/0#VERSION#" \
    /proc/self/fd/0 \
    other_files \
    and_folders/

结果应该是一个文件VERSION,在tar存档中有一个时间戳,无需在本地生成文件:

$ tar tf test.tar
VERSION
other_files
and_folders

2 个答案:

答案 0 :(得分:1)

我不知道在JAR档案中创建“假”文件条目的方法。我创建了一个普通文件,将其添加到存档中,然后将其删除。

您可能想尝试选项-A(或--concatenate)。这将允许您在/tmp中创建文件,将其添加到TAR存档,然后在第二步中附加其余文件。这样,您就可以为VERSION文件创建任意路径。

答案 1 :(得分:1)

虽然tar对文件起作用是正确的,但这并不意味着你必须自己创建临时文件,我会反对它。

您可以使用流程替换(Bash支持,Fish也在slightly different syntax中执行)。

tar cvaf a.tgz <(echo 1.0.0) file1 file2 -P --transform 's:^/.*:VERSION:'

-P--absolute-names)用于标识名称转换的临时文件以重命名它。希望其他文件是本地的。

如果不是这种情况并且其他一些文件是通过绝对路径添加的(这可能不是常见的情况),那么您可以澄清转换正则表达式或使用两步解决方案先创建存档然后更新它(正如亚伦指出的那样)。