web-dev-qa-db-ja.com

解凍する前にZipアーカイブ内のファイルの名前を変更することは可能ですか?

ファイル名が解凍プログラムで読み取れない形式でエンコードされているシステムにパックされたZipファイルをWebから取得しました。おそらく、ファイルシステムはそれらの奇妙な文字やシェルをサポートしていません。よくわかりません。

私はファイル名をあまり気にしないので、許容できる解決策は、ファイルの名前を変更するか、アーカイブで指定された名前以外の名前のファイルに内容を書き込むことです。それは一般的なコマンドライン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 'を使用してファイルを正常に抽出しているため、グラフィカルアーカイバに関する提案には特に関心がありません。

unzip -p file.Zip archivedfilename.ext > newfilename.extをお試しいただけますか?

2
Karan

私は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
Gaël Ecorchard

GNU Info-Zipパッケージには zipnote というユーティリティが含まれており、Zipアーカイブ内のファイル名を編集したりファイルコメントを操作したりできます( "ノート")。

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

古い名前を正確に知っている必要があるようです。ワイルドカードのサポートはありません。

また、一度に1つのファイルしか名前を変更できないようです。アーカイブ内のすべてのファイルの名前を変更するには、次のようになりました。

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スクリプトの最初。)

1
tripleee

nzipに提出されたバグ で、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/*
0
Yury