Renommer des centaines de fichiers à la fois pour un tri correct

22

J'ai une tonne de fichiers, tous nommés comme 1.jpg , 2.jpg , 3.jpg , et ainsi de suite jusqu'à 1439.jpg , cependant, j'ai un problème avec l'un de mes projets et le classement par ordre alphabétique. Il va généralement dans l'ordre 1.jpg , 10.jpg , 11.jpg et ainsi de suite.

Ce dont j'ai besoin, c’est un moyen de nommer les fichiers au format tel que 00001.jpg jusqu’à 01439.jpg .

Comment pourrais-je le faire rapidement et efficacement?

    
posée Kaz Wolfe 28.05.2014 - 05:55
la source

6 réponses

33

Ubuntu est livré avec un script appelé rename . C'est juste un petit script Perl qui comporte un certain nombre de fonctionnalités de renommage en masse mais le meilleur (dans ce cas) est la possibilité d'exécuter Perl pendant le remplacement. Le résultat est une solution vraiment compacte:

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

Ceci est similaire aux autres réponses printf -style ici mais tout est géré pour nous. Le code ci-dessus concerne un nombre à 5 chiffres (y compris un nombre variable de zéros non significatifs).

Il recherchera et remplacera la première chaîne numérique trouvée par une version à remplissage nul et laissera le reste du nom de fichier seul. Cela signifie que vous n’avez pas à vous soucier d’emporter une extension ou un préfixe.

Note: ce n'est pas complètement portable. De nombreuses distributions utilisent rename.ul du package util-linux comme binaire rename par défaut. Ceci est une alternative significativement retardée (voir man rename.ul ) qui ne comprendra pas ce qui précède. Si vous aimez cela sur une plate-forme qui n'utilise pas le renommage de Perl, découvrez d'abord comment l'installer.

Et voici un harnais de test:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

Et un exemple de préfixes (nous ne faisons rien de différent):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3
    
réponse donnée Oli 28.05.2014 - 11:37
la source
20
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f 'printf "%.5d" "${f%.*}"'.jpg  ; fi ; done

Modifier

Explication:

  • if [[ $f =~ [0-9]+\. ]] s'assure que seuls les fichiers dont le nom est un numéro (suivi d'un point) sont renommés.
  • printf "%.5d" NUMBER ajoute les zéros en tête
  • "${f%.*}" coupe l'extension (.jpg) et ne laisse que le nombre
  • .jpg après le second backtick ajoute à nouveau l'extension de fichier.

Notez que cela ne fonctionnera que sur les noms de fichiers qui sont des nombres. Les zéros de gauche qui remplissent les fichiers non numérotés nécessiteraient un format différent.

Si vous voulez expérimenter, essayez cette commande:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f 'printf "%.5d" "${f%.*}"'.jpg  ; fi ; done

Modifier 2

Rendez la commande plus sûre en vous assurant que seuls les noms de fichiers portant des numéros sont renommés. Notez que tous les fichiers préexistants nommés comme 00001.jpg seront remplacés.

    
réponse donnée sмurf 28.05.2014 - 06:02
la source
6

Ci-dessous un script python.

Le script ajoute des zéros au nombre de chiffres défini. Si le nom est plus grand que cela, le fichier (nom) est intact.

La combinaison de différentes extensions dans une action de renommage peut être plus pratique. Pour ajouter des extensions, ajoutez-les simplement au tuple, par exemple extensions = (".jpg", ".jpeg", ".tiff") .

Copiez le texte dans un fichier vide, enregistrez-le sous le nom rename.py , entrez le chemin d'accès correct au répertoire des fichiers ( sourcedir ), le nombre de chiffres souhaités pour les nouveaux noms ( number_ofdigits ) et les extensions de fichier à renommer ( extensions )

Exécutez-le par la commande:

python3 /path/to/script/rename.py

Le script:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

modifier:

Ci-dessous une version légèrement améliorée. Il détermine automatiquement le nom le plus long du répertoire et ajoute des zéros à la longueur du nom le plus long.

exemple:

1.jpg
12.jpg
123.jpg

devient:

001.jpg
012.jpg
123.jpg

Pas besoin de définir le nombre de chiffres.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])
    
réponse donnée Jacob Vlijm 28.05.2014 - 06:33
la source
2

Il existe un utilitaire de renommage implémenté dans Perl qui rend cela très facile:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

Le premier argument est une expression Perl évaluée pour chaque nom de fichier.

    
réponse donnée Mats Kindahl 28.05.2014 - 11:46
la source
0

Il existe une interface graphique appelée pyRenamer qui se trouve dans les référentiels. Installez, démarrez, sélectionnez votre répertoire et placez simplement le 'Modèle de nom de fichier renommé' sur '{num5}' dans l'onglet 'Modèles' et cliquez sur le bouton 'Renommer'. Vous pouvez également prévisualiser ce qui se passera avant de renommer.

    
réponse donnée user287888 28.06.2014 - 07:32
la source
-4
for file in '(find * -maxdepth 1 -type f -name "*.jpg")'     
do    
  mv $file "000"$file    
done

Ceci est grossier, car il ne fait pas intelligemment le changement de nom, il faudra penser à une astuce pour cela. Mais cela devrait vous aider à trier les choses.

Mise à jour: vous avez une réponse plus complète.

    
réponse donnée Swarnendu Biswas 28.05.2014 - 06:02
la source

Lire d'autres questions sur les étiquettes