如何更新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
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
你基本上有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.
后两者可能会根据文件的相对时间戳和存档来更新,也可能不会。我猜你在这方面遇到了问题。也许存档中有错误的时间戳?或者文件系统之间存在差异?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
zipnote
对语法非常严格;在@
之前不能有任何空格...) - Sylvain Leroux