web-dev-qa-db-fra.com

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

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?

23
Kaz Wolfe

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
35
Oli
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
  • .jpgaprè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.

21
sмurf

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 (sourcedirname__), le nombre de chiffres que vous souhaitez attribuer aux nouveaux noms (number_ofdigits) et la ou les extensions de fichier à renommer. (extensionsname__)

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])
6
Jacob Vlijm

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.

2
Mats Kindahl

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.

0
user287888