如何更新zip压缩包中的单个文件?

3

如何更新zip存档中的单个文件?(令人惊讶的是,我在现有线程中找不到相关信息。)

假设我有一个some.zip存档,我想要使用/system/on/my/linux/file1.txt路径替换存档中的path/in/zip/file1.txt。

像下面这样的命令对我不起作用: zip -f some.zip path/in/zip/file1.txt /path/on/my/linux/file1.txt

2个回答

4
如果您需要替换和重命名,您可能需要发出几个命令。因此,假设您要在存档中用 path/on/linux/b 替换 path/in/zip/b(保留原始名称在归档中):
# Delete original
zip -d f.zip path/in/zip/b
# Add new
zip f.zip path/on/linux/b
# Rename
printf "@ path/on/linux/b\n@=path/in/zip/b" | zipnote -w f.zip

对于“重命名”部分的另一种语法,更易读(至少对我来说):

zipnote -w f.zip << EOF
@ path/on/linux/b
@=path/in/zip/b
EOF

谢谢,你让我的一天!最后一个命令一直抱怨一些不正确的格式,直到我修改它为printf "@ path/on/linux\n@=path/in/zip\n" | zipnote -w f.zip。 - Andrei
只是好奇,zip命令本身不支持将一个路径重命名为另一个路径吗? - Andrei
@Andrei 如果有帮助很高兴。随意投票和/或接受答案 ;) 关于您的评论:(评论1)好奇。可能是工具的各个版本之间存在一些差异?我在Debian Wheezy上使用ZipNote 3.0(2008年7月5日)。 (评论2)不!这很遗憾,但它并没有...至少在我的Debian盒子上(Zip 3.0 July 5th 2008)。 - Sylvain Leroux
@Andrei 关于您的第一条评论,我添加了一种可行的语法。如果你愿意可以尝试使用它(正如你所注意到的 zipnote 对语法非常严格;在 @ 之前不能有任何空格...) - Sylvain Leroux

3

你基本上有3个选项来更新一个归档文件: 添加更新刷新

   add
          Update existing entries and add new files.  If the archive  does
          not exist create it.  This is the default mode.

   update (-u)
          Update  existing entries if newer on the file system and add new
          files.  If the archive does not exist issue warning then  create
          a new archive.

   freshen (-f)
          Update  existing entries of an archive if newer on the file sys‐
          tem.  Does not add new files to the archive.
后两者可能会根据文件的相对时间戳和存档来更新,也可能不会。我猜你在这方面遇到了问题。也许存档中有错误的时间戳?或者文件系统之间存在差异?
无论如何,要更新ZIP存档而不考虑文件时间戳,只需使用没有标志的"zip"命令即可。以下是演示的示例会话:
1)创建存档:
sylvain@bulbizarre:/tmp/u$ echo a | tee f1 | tee f2 > f3
sylvain@bulbizarre:/tmp/u$ zip f.zip f1 f2 f3
  adding: f1 (stored 0%)
  adding: f2 (stored 0%)
  adding: f3 (stored 0%)

2) 修改文件并更新存档

sylvain@bulbizarre:/tmp/u$ echo b > f2
sylvain@bulbizarre:/tmp/u$ zip f.zip f2
updating: f2 (stored 0%)

3) 提取并检查存档内容

sylvain@bulbizarre:/tmp/u$ unzip f.zip
Archive:  f.zip
replace f1? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
 extracting: f1                      
 extracting: f2                      
 extracting: f3                      
sylvain@bulbizarre:/tmp/u$ cat f?
a
b
a

更新带有路径的文件的命令是什么,而不仅仅是zip f.zip f2,如果f2在f.zip中具有较长的路径,该怎么办? - Andrei
@Andrei,由于这个问题与我最初理解的有些不同,因此我在下面发布了一个不同的答案。希望这可以帮到你! - Sylvain Leroux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接