如何更新zip存档中的单个文件

时间:2014-07-09 21:43:40

标签: bash zip

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

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

以下命令对我不起作用: zip -f some.zip path / in / zip / file1.txt /path/on/my/linux/file1.txt

2 个答案:

答案 0 :(得分:2)

您基本上有 3 选项更新存档:添加更新刷新< / em>的

   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

答案 1 :(得分:2)

如果您需要更换和重命名,则可能需要发出几个命令。因此,假设您要通过path/in/zip/b替换存档中的path/on/linux/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

&#34;重命名&#34;的替代语法部分,某种程度上更具可读性(至少对我来说):

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