我从网上下载了一个 zip 文件,该文件是在某个系统上打包的,而这个系统的文件名编码格式是我的解压程序无法读取的。也许文件系统不支持这些奇怪的字符,或者不支持 shell。我不太确定。
由于我不太在意文件名,因此可接受的解决方案是重命名文件,或将内容写入与存档中指定的名称不同的文件。使用常见的命令行 zip 实用程序可以做到这一点吗?如果可以,怎么做。也欢迎提出其他可能出现问题的建议(也许不是 zip 实用程序的问题)。
症状如下:
$ unzip -l 3688232.zip ; unzip 3688232.zip
Archive: 3688232.zip
Length Date Time Name
--------- ---------- ----- ----
107937 10-24-2012 01:00 [-?M+?V+?e-?] Le Gout Des autres - Agn+?s Jaoui - 2000 (sep subs).srt
6354 10-24-2012 01:00 le.gout.des.autres.(3688232).nfo
--------- -------
114291 2 files
Archive: 3688232.zip
error: cannot create [-?M+?V+?e-?] Le Gout Des autres - Agn+?s Jaoui - 2000 (sep subs).srt
Invalid or incomplete multibyte or wide character
$ unzip --help
UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler. Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.
注意:
我对涉及图形归档器的建议不是特别感兴趣,因为我已经使用“wine WinRAR.exe”成功提取了文件。
答案1
你能试一下unzip -p file.zip archivedfilename.ext > newfilename.ext
吗 ?
答案2
我设法使用 Python 获取了所有文件:
import zipfile
z = zipfile.ZipFile('file.zip')
for i, f in enumerate(z.filelist):
f.filename = 'file_{0:03}'.format(i)
z.extract(f)
您还将获得一些与目录条目相对应的空文件。
答案3
GNU Info-Zip 软件包中包含一个实用程序,名为zipnote
它允许您编辑 zip 存档中的文件名以及操作文件注释(“注释”)。
zipnote -w file.zip <<<$'@ oldname\n@=newname'
看来您必须准确地知道旧名称;没有通配符支持。
似乎您一次只能重命名一个文件。我最终使用以下命令重命名存档中的所有文件:
unzip -Z1 file.zip |
awk '{ printf "file%06i %s\n", NR, $1 }' |
while read -r to from; do
printf '@ %s\n@=%s\n' "$from" "$to" | zipnote -w file.zip
done
"$to"
(请注意在 Awk 脚本中首先打印正则化文件名的技巧。)
答案4
在关于 unzip 的一个错误,Yannis Tsop (ogiannhs) 于 2010-05-25 写道:#12
使用7-zip可以解决!
例如:
LANG=el_GR.CP737 7z x -oPATH file.zip convmv -r --notest -f utf-8 -t CP737 PATH/*