Is it possible to rename files in a zip archive before extracting?

I pulled a zip file from the web which was packed on a system where filenames were encoded in a format my unzip program fails to read. Perhaps the file-system does not support those weird characters, or the shell. I'm not entirely sure.

Since I don't really care about the filename an acceptable solution would be to rename the file, or write the contents to a file named something else than the name specified in the archive. Is that possible with a common command line zip utility? If so, how. Other suggestions on what may be wrong (perhaps it's not the zip utility) are also welcome.

The symptoms are as follows:

$ 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 see README for details.

Note:
I am not particularly interested in suggestions involving graphical archivers, because I have already successfully extracted the file using `wine WinRAR.exe'.

2

4 Answers

Can you try unzip -p file.zip archivedfilename.ext > newfilename.ext?

3

I managed to get all the files with 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)

You will also get some empty files corresponding to the directory entries.

The GNU Info-Zip package includes a utility called zipnote which allows you to edit file names inside a zip archive as well as manipulate file comments ("notes").

zipnote -w file.zip <<<$'@ oldname\n@=newname'

It seems you have to know the old name exactly; there is no wildcard support.

It also seems you can only rename a single file at a time. I ended up with the following to rename all the files in an archive:

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

(Note the trickery to print the regularized file name "$to" first in the Awk script.)

In a bug filed on unzip, Yannis Tsop (ogiannhs) wrote on 2010-05-25: #12

using 7-zip it can be solved!

eg:

LANG=el_GR.CP737 7z x -oPATH file.zip
convmv -r --notest -f utf-8 -t CP737 PATH/*

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like