Como renomear / extrair arquivos com nomes longos no arquivo zip

11

Eu tenho um zip que contém arquivos com nomes muito longos.

Se eu tentar extrair na linha de comando, recebo o erro "O nome do arquivo é muito longo".
Se eu usar o gerenciador de arquivos gráficos, ele não extrairá os arquivos e não permitirá que eu os renomeie. O mesmo problema ocorre se eu montar o arquivo.

Eu posso extrair e renomear arquivos individualmente usando:

unzip -p -c example.zip "long file name.ogg" > shortname.ogg

Isso é impraticável com muitos arquivos.

Existe uma ferramenta que truncará nomes de arquivos à medida que são extraídos?

Terence Eden
fonte
Qual é o resultado unzip -l <ARCHIVE>e como você deseja que os nomes sejam truncados? Deseja manter a estrutura de diretórios dentro do arquivo morto durante a extração?
David Foerster

Respostas:

13

Extrair

Podemos usar zipinfocomo parte desse processo, é um programa do zippacote.

zipinfo -2 example.zip

mostrará apenas os nomes dos arquivos example.zip, algo parecido com:

file1-long-name-...-bla-bla.html
file2-long-name-...-bla-bla.html

para que possamos usar esse recurso para extrair todos os arquivos:

zipinfo -2 example.zip | while read i;
do
  long_fname=${i%.*}
  unzip -p -c example.zip "$i" > "${long_fname:0:250}.${i##*.}"
done;
  • long_fname=${i%.*}: Remove a extensão do nome do arquivo longo; portanto, no caso de o nome do arquivo ter menos de 256 caracteres; Não vamos obter uma extensão duplicada.
  • ${long_fname:0:250}.${i##*.}: Cria um novo nome de arquivo com número legítimo de caracteres e também adiciona uma .extensão real e arquivo.

Simplesmente entramos na lista de arquivos e extraímos cada um deles com um novo nome de arquivo legítimo, com 256 caracteres.


Renomear

Você pode usar o zipnotecomando, também faz parte do zippacote.

Faça um backup do seu arquivo zip primeiro.

Execute este comando:

zipnote example.zip > names

Abra nomes usando um editor, é assim:

@ file name long in zip and a lot of other strings in the file name
@ (comment above this line)
@ (zip file comment below this line)

Adicione novos nomes de arquivos como este:

@ file name long in zip and a lot of other strings in the file name
@=new short name for above file
@ (comment above this line)
@ (zip file comment below this line)

Para renomear arquivos, use:

zipnote -w example.zip < names

Você renomeou todos eles, também pode escrever um script simples que faça isso automaticamente para você.

Ravexina
fonte
Esses são incrivelmente úteis, obrigado! Não consegui que o exemplo do zipnote funcionasse - e o primeiro remove a extensão do arquivo - mas isso é bom o suficiente para o que preciso fazer. Obrigado!
Terence Eden
Eu atualizei a resposta, agora ele vai manter a extensão também;)
Ravexina
Você deve usar IFS= read -r ino caso de os nomes dos arquivos começarem com espaço em branco ou conter itens que o shell possa interpretar como seqüências de escape.
David Foerster