我想从通过 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,但您描述了两个限制:
- 通过从管道读取来创建存档 - 无需创建临时文件
- 使用广泛可用的归档工具
您的“无临时文件”约束意味着您必须从管道创建存档。 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.png
为archive.zip
文件dev/stdin
然后将保存的文件重命名custom_filename1.png
为zipnote
.此重命名操作是原子的 - 不会创建临时文件。
答案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
您可以通过转到文件管理器并右键单击您的文件并单击压缩然后将其设置为您想要的任何文件类型来轻松绕过该问题。