12 votes

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

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

Si j'essaie d'extraire en ligne de commande, j'obtiens l'erreur "File name too long".
Si j'utilise le gestionnaire d'archives graphique, il n'extraira pas les fichiers et ne me laissera pas 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

Cette méthode n'est pas pratique lorsque le nombre de fichiers est important.

Existe-t-il un outil qui tronque les noms de fichiers au fur et à mesure de leur extraction ?

18voto

Ravexina Points 50599

Pour extraire

Nous pouvons utiliser zipinfo dans le cadre de ce processus, il s'agit d'un programme de zip l'emballage.

zipinfo -2 example.zip

n'affichera que les noms de fichiers dans example.zip Il s'agit de quelque chose qui ressemble à.. :

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

nous pouvons donc utiliser cette fonction 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, de sorte que si le nom de fichier est inférieur à 256 caractères, nous n'obtiendrons pas d'extension en double.
  • ${long_fname:0:250}.${i##*.} : Crée un nouveau nom de fichier avec un nombre légitime de caractères et ajoute un symbole . et l'extension réelle du fichier.

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


Pour renommer

Vous pouvez utiliser zipnote il fait partie de la commande zip également.

Faites d'abord une sauvegarde de votre fichier zip.

Exécutez cette commande :

zipnote example.zip > names

Ouvrez les noms à l'aide d'un éditeur, cela 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 suit :

@ 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 simple script qui le fera automatiquement pour vous.

0voto

Metaxal Points 353

L'autre réponse n'a pas fonctionné pour une raison quelconque, même après avoir réduit le nom du fichier de sortie à une longueur de 100. J'ai donc extrait tous les fichiers en une seule fois avec unzip -p > all.txt puis diviser le fichier all.txt avec csplit sur la base d'un certain modèle.

Notez qu'unzip ajoutera des lignes comme

------=_Part_4952_1005066427.1638023175221

y

    boundary="----=_Part_4953_1221949914.1638023175221"

qui devrait être supprimé de la sortie et probablement utilisé pour diviser le fichier, mais je n'ai pas eu besoin de le faire, donc la façon de le faire correctement est laissée comme un exercice :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X