目的
我正在创建一个将数据库表转储到压缩7z
文件的函数。的输出通过mysqldump
管道传送到开关。生成的文件中应该始终只有一个文件和一个文件。生成的文件的名称如.如果调用我的函数并且存档已经存在,则它不会重新创建存档,除非.如果,它会删除存档并再次压缩。有没有办法通过 7zr 开关再次实现文件删除和存档压缩?7zr
-si
7z
database_table.sql.7z
force=TRUE
force=TRUE
rm database.sql.7z
rm
正如我上面所写, 的输出通过开关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 就会知道您正在尝试更新已有的内容。