J'ai une tonne de fichiers, tous nommés tels que 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 mon alphabétisation. Il va généralement dans l'ordre 1.jpg
, 10.jpg
, 11.jpg
et ainsi de suite.
Ce qu'il me faut, c'est un moyen de nommer les fichiers afin qu'ils soient dans le format tel que 00001.jpg
jusqu'à 01439.jpg
.
Comment pourrais-je le faire rapidement et efficacement?
Ubuntu est livré avec un script appelé rename
. C'est juste un petit script Perl qui comporte un certain nombre de fonctionnalités puissantes de changement de nom en bloc, mais le meilleur (dans ce cas) est la possibilité pour lui 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 de style printf
- ici, mais tout est traité pour nous. Le code ci-dessus correspond à 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 complétée de zéros et laissera le reste du nom de fichier seul. Cela signifie que vous n'avez pas à vous soucier de transporter 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 par défaut rename
. C'est une alternative nettement retardée (voir man rename.ul
) qui ne comprendra pas ce qui précède. Si vous souhaitez cela sur une plate-forme qui n'utilise pas le nom renommé de Perl, découvrez comment l'installer en premier.
Et voici un test harnais:
$ 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
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
Éditer
Explication:
if [[ $f =~ [0-9]+\. ]]
s'assure que seuls les fichiers dont le nom est un nombre (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 numéro.jpg
après le deuxième backtick ajoute à nouveau l'extension de fichier.Notez que cela ne fonctionnera que sur les noms de fichiers qui sont des nombres. Des zéros à gauche pour 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
Edit 2
Rendez la commande plus sûre en vous assurant que seuls les noms de fichiers numérotés sont renommés. Notez que tous les fichiers préexistants portant le nom 00001.jpg seront écrasés.
Ci-dessous un script python.
Le script ajoute des zéros au début du nombre défini de chiffres. Si le nom est plus grand que cela, le fichier (nom) n'est pas modifié.
La combinaison de différentes extensions en une seule action de changement de nom peut s'avérer 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 rename.py
, entrez le chemin correct du répertoire des fichiers (sourcedir
name__), le nombre de chiffres que vous souhaitez attribuer aux nouveaux noms (number_ofdigits
) et la ou les extensions de fichier à renommer. (extensions
name__)
Exécutez-le à l'aide de la commande:
python3 /path/to/script/rename.py
Le scénario:
#!/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)
edit:
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])
Il existe un utilitaire de changement de nom 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.
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 définissez le "Modèle de nom de fichier renommé" sur "{num5}" dans l'onglet "Modèles", puis cliquez sur le bouton "Renommer". Vous pouvez également prévisualiser ce qui se passera avant de renommer.