目的

目的

目的

我正在创建一个将数据库表转储到压缩7z文件的函数。的输出通过mysqldump管道传送到开关。生成的文件中应该始终只有一个文件和一个文件。生成的文件的名称如.如果调用我的函数并且存档已经存在,则它不会重新创建存档,除非.如果,它会删除存档并再次压缩。有没有办法通过 7zr 开关再次实现文件删除和存档压缩?7zr-si7zdatabase_table.sql.7zforce=TRUEforce=TRUErm database.sql.7zrm

正如我上面所写, 的输出通过开关mysqldump传送到,以便没有文件“磁盘上的文件”与“存档中的文件”进行比较,如 7zr-si-u 更新开关文档。

问题

我的问题是,如果存档文件已存在,则内容将添加到现有存档中,而不是覆盖所有存档内容。例如,如果我使用以下命令创建一个虚拟存档:

 $ echo "Hello"| 7zr a -si hello.txt.7z
Creating archive hello.txt.7z

Compressing  [Content]      

Everything is Ok

我可以第二次运行该命令:

 $ echo "Hello"| 7zr a -si hello.txt.7z
Updating archive hello.txt.7z

Compressing  [Content]      

Everything is Ok

但第三次 7zr 返回错误:

 $ echo "Hello"| 7zr a -si hello.txt.7z

Error:
Duplicate filename:
hello.txt
hello.txt

我的后备解决方案是在重新创建存档之前简单地删除它。事实上,我想覆盖存档内容,但覆盖开关-ao仅适用于提取,不适用于创建存档。哪个7zr开关我可以用于该目的吗?

答案1

“覆盖”有点模糊,但假设您想要更新现有存档,以便它与最初创建存档的目录中的更改同步。使用u开关然后从本页第三个表中找出魔术代码https://sevenzip.osdn.jp/chm/cmdline/switches/update.htm

如果我从目录创建存档像这样:

7zr a foo.7z foo

然后我可以将文件添加、更改或删除(“同步”)有了这个:

7zr u foo.7z -up1q0r2y2 foo

根据您感兴趣的更改,魔术代码可能会略有不同(请参阅该页面上的第一个表)。

相当神秘。

编辑:经过一番反复之后,OP 似乎要求从 STDIN 填充存档,并且只是想每次覆盖现有的存档内容。以下内容解决了这个问题。

您需要指定与您的数据关联的“文件名”。这是通过在标志后面放置一个名称-si(之间没有空格)来完成的:

<input> | 7zr a -sifoo foo.7z

此命令适用于存档的初始创建以及更新。

背景:如此处所示https://sevenzip.osdn.jp/chm/cmdline/switches/stdin.htm

如果未指定 file_name,数据将不带名称存储

因此 7zr 将无法知道现有内容与后续输入相关联。这就是为什么您每次更新时都会看到新的存档条目。一旦您为输入命名,7zr 就会知道您正在尝试更新已有的内容。

相关内容