是否可以在解压之前重命名 zip 文件中的文件?

是否可以在解压之前重命名 zip 文件中的文件?

我从网上下载了一个 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/*

相关内容