Comment renommer / extraire des fichiers avec des noms longs dans une archive zip

11

J'ai un zip qui contient des fichiers avec des noms très longs.

Si j'essaye d'extraire sur la ligne de commande, j'obtiens l'erreur "Nom de fichier trop long".
Si j'utilise le gestionnaire d'archives graphiques, il n'extrayera pas les fichiers et ne me permettra pas de les renommer. Le même problème se produit si je monte l'archive.

Je peux extraire et renommer des fichiers individuellement en utilisant:

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

Ce n'est pas pratique avec beaucoup de fichiers.

Existe-t-il un outil qui tronquera les noms de fichiers lors de leur extraction?

Terence Eden
la source
Quelle est la sortie de unzip -l <ARCHIVE>et comment voulez-vous que les noms soient tronqués? Voulez-vous conserver la structure du répertoire à l'intérieur de l'archive pendant l'extraction?
David Foerster

Réponses:

13

Extraire

Nous pouvons utiliser zipinfodans le cadre de ce processus, c'est un programme de zippackage.

zipinfo -2 example.zip

affiche uniquement les noms des fichiers example.zip, quelque chose ressemble à:

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

afin que nous puissions utiliser cette fonctionnalité pour extraire tous les fichiers:

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%.*}: Supprime l'extension du nom de fichier long, donc si le nom de fichier est inférieur à 256 caractères; Nous n'allons pas obtenir une extension en double.
  • ${long_fname:0:250}.${i##*.}: Crée un nouveau nom de fichier avec un nombre légitime de caractères, ajoute également une .extension réelle et un fichier.

Nous faisons simplement une boucle dans la liste des fichiers et extrayons chacun d'eux avec un nouveau nom de fichier légitime de 256 caractères.


Renommer

Vous pouvez utiliser la zipnotecommande, elle fait également partie du zippackage.

Obtenez d'abord une sauvegarde de votre fichier zip.

Exécutez cette commande:

zipnote example.zip > names

Noms ouverts à l'aide d'un éditeur, ça ressemble à ceci:

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

Ajoutez de nouveaux noms de fichiers comme celui-ci:

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

Ensuite, pour renommer les fichiers, utilisez:

zipnote -w example.zip < names

Vous les avez tous renommés, vous pouvez également écrire un script simple qui le fait automatiquement pour vous.

Ravexina
la source
Ce sont incroyablement utiles, merci! Je n'ai pas réussi à faire fonctionner l'exemple zipnote - et le premier supprime l'extension de fichier - mais c'est suffisant pour ce que je dois faire. Merci!
Terence Eden
J'ai mis à jour la réponse, maintenant elle conservera aussi l'extension;)
Ravexina
Vous devez utiliser IFS= read -r idans le cas où les noms de fichiers commencent par un espace blanc ou contiennent des éléments que le shell peut interpréter comme des séquences d'échappement.
David Foerster