从通过标准输入给定的文件创建存档(tar.gz,...)

从通过标准输入给定的文件创建存档(tar.gz,...)

我想从通过 stdin 给定的文件自动创建压缩存档(或者创建存档,如果它尚不存在),同时指定存档内的文件名。

7zip 似乎有一个功能正是我所追求的(多库)。

用法是这样的:

cat some_file.png | 7z a archive.7z -t7z -si"custom_filename1.png"

这会向 archive.7z 添加一个名为“custom_filename1.png”的文件。但是,如果可能的话,我希望在没有 7zip 的情况下执行此操作,因为我认为大多数 Linux 发行版上都不会预安装 7zip。我搜索了一种使用 tar 执行此操作的方法,但只找到了这个邮政这似乎不适用于我的机器。

我不想创建临时文件。

答案1

您似乎想要做的是将文件tar从其他命令的标准输出中一个接一个地添加到存档中。

假设存档存在,您可以使用以下命令向其中添加给定文件

tar -u -f archive.tar filename

或者,如果您正在使用压缩档案,

tar -uz -f archive.tar.gz filename

调用的文件filename必须存在于文件系统中。这意味着您的工作流程必须保存文件,然后将其添加到存档中,然后才能再次删除文件。

可能是这样的:

somecommand filename.png >newfile1.png &&
tar -u -f archive.tar newfile1.png &&
rm newfile1.png

命令之间的连接&&将确保如果前一个命令由于某种原因失败,则命令不会运行。

请注意,您必须将每个具有新名称的文件添加到存档中,因为添加与预先存在的文件同名的文件会“隐藏”存档中的旧文件。

答案2

使用 zip 和 bash:

cat some_file.png | zip -v --fifo archive.zip /dev/stdin
printf '%s\n' '@ dev/stdin' '@=custom_filename1.png' | zipnote -w archive.zip

# view archive contents:
unzip -l archive.zip

Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     5200  2020-09-26 12:41   custom_filename1.png
---------                     -------
     5200                     1 file

您提到了 tar,但您描述了两个限制:

  1. 通过从管道读取来创建存档 - 无需创建临时文件
  2. 使用广泛可用的归档工具

您的“无临时文件”约束意味着您必须从管道创建存档。 Tar 只读取文件 - 而不是管道 - 所以 tar 可能是不行的。

zip --fifo从管道读取并将输出保存为存档中的文件。 Zip 可能不如 tar 流行,但肯定比 7z 更流行。

zip 从 /dev/stdin 读取文件内容:

cat some_file.png | zip -v --fifo archive.zip /dev/stdin
    zip warning: Reading FIFO (Named Pipe): /dev/stdin
  adding: dev/stdin (in=39032) (out=1468) (deflated 96%)
total bytes=39032, compressed=1468 -> 96% savings

这会将内容保存some_file.pngarchive.zip文件dev/stdin

然后将保存的文件重命名custom_filename1.pngzipnote.此重命名操作是原子的 - 不会创建临时文件。

答案3

打包文件,filename输出为filename.tgz

tar czf filename.tgz filename

打包文件列表中的一个或多个文件

tar czf files.tar.gz --files-from ./filelist

同样的事情,但方法不同

ls -1b . >./filelist && tar czf ./files.tar.gz --files-from ./filelist

添加(更新 tarball)附加文件

tar czuf ./files.tar.gz ./newfile

笔记:取决于您的tar选项版本可能或者不得需要前面的连字符-

选项图例

  • C创造
  • z使用gzip压缩
  • 更新(添加附加文件)
  • F tar文件名
  • --文件来自获取文件内容作为要打包/添加的文件列表

另请参阅tar 手册页

华泰

答案4

您可以通过转到文件管理器并右键单击您的文件并单击压缩然后将其设置为您想要的任何文件类型来轻松绕过该问题。

相关内容