Cómo renombrar / extraer archivos con nombres largos en el archivo zip

11

Tengo un zip que contiene archivos con nombres muy largos.

Si intento extraer en la línea de comando, aparece el error "Nombre de archivo demasiado largo".
Si uso el administrador de archivo gráfico, no extraerá los archivos y no me permitirá cambiarles el nombre. El mismo problema ocurre si monte el archivo.

Puedo extraer y renombrar archivos individualmente usando:

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

Esto no es práctico con muchos archivos.

¿Existe una herramienta que truncará los nombres de los archivos a medida que se extraen?

Terence Eden
fuente
¿Cuál es el resultado unzip -l <ARCHIVE>y cómo desea que se trunquen los nombres? ¿Desea retener la estructura de directorios dentro del archivo durante la extracción?
David Foerster

Respuestas:

13

Extraer

Podemos usarlo zipinfocomo parte de este proceso, es un programa del zippaquete.

zipinfo -2 example.zip

solo mostrará los nombres de los archivos example.zip, algo parecido a esto:

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

para que podamos usar esta función para extraer todos los archivos:

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%.*}: Elimina la extensión del nombre de archivo largo, por lo que en caso de que el nombre del archivo sea menor que 256 caracteres; No vamos a obtener una extensión duplicada.
  • ${long_fname:0:250}.${i##*.}: Crea un nuevo nombre de archivo con un número legítimo de caracteres y también agrega una .extensión real de archivo.

Simplemente estamos ingresando a la lista de archivos y extraemos cada uno de ellos con un nuevo nombre de archivo legítimo que es de 256 caracteres.


Renombrar

Puede usar el zipnotecomando, también es parte del zippaquete.

Obtenga una copia de seguridad de su archivo zip primero.

Ejecute este comando:

zipnote example.zip > names

Abra los nombres usando un editor, se ve así:

@ 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)

Agregue nuevos nombres de archivo 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)

Luego, para cambiar el nombre de los archivos, use:

zipnote -w example.zip < names

Los renombró a todos, también puede escribir un script simple que haga esto automáticamente por usted.

Ravexina
fuente
Esos son increíblemente útiles, ¡gracias! No pude hacer que el ejemplo de zipnote funcionara, y el primero elimina la extensión del archivo, pero eso es lo suficientemente bueno para lo que necesito hacer. ¡Gracias!
Terence Eden
Actualicé
Debe usar IFS= read -r ien caso de que los nombres de los archivos comiencen con espacios en blanco o contengan elementos que el shell pueda interpretar como secuencias de escape.
David Foerster