Dependendo da codificação usada para criar o arquivo zip, talvez você possa evitar traduções indesejadas definindo temporariamente a localidade como "C":
LC_ALL=C 7z x $archive
(Isso ajudou a criar um zip criado pelo IZArc no Win7, usando dois dos seus nomes de arquivos de exemplo.)
No entanto, para o arquivo na pergunta, o campo "filename" contém a codificação CP1251 de "ДКП.doc" ( 84 8a 8f 2e 64 6f 63
). O campo "extra" usa uma extensão Info-zip (veja a seção 4.6.9 da Zip Specification v 6.3.4 ) para armazenar o nome do arquivo UTF-8. unzip
sabe sobre esse cabeçalho e usa o nome UTF-8, ignorando o nome CP1251.
7z
não faz nada com esse "campo extra" e usa apenas o CP1251. Dependendo da localidade atual, ele pode criar o arquivo usando esse nome exato (os bytes brutos 84 8a 8f
), ou pior, tratá-los como pontos unicode a serem expandidos para UTF-8 primeiro ( c2 84 c2 8a c2 8f
).
Uma opção é usar utilitários externos para alterar o zip
primeiro:
#!/bin/bash
cp orig.zip renamed.zip
index=0
zipinfo -1 orig.zip | while read name ; do
ziptool renamed.zip rename $index "$name"
index=$((index+1))
done
ziptool
é de libzip . zipinfo
é distribuído com o Info-ZIP's UnZip , então você deve ter usado apenas unzip