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

23

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

Ce dont j'ai besoin, c'est d'un moyen de nommer les fichiers afin qu'ils soient dans le format tel que 00001.jpgjusqu'à la fin 01439.jpg.

Comment pourrais-je le faire rapidement et efficacement?

Kaz Wolfe
la source
Ce que vous recherchez est un "tri naturel", peut-être que cela aide: askubuntu.com/questions/41390/…
Fabian Blechschmidt
Une réponse qui n'est pas une réponse directe? ls -v unix.stackexchange.com/questions/33909/…
WernerCD
+1 parce que j'ai essayé de le faire en vain pyrenamer.
Parto
@FabianBlechschmidt, j'ai besoin de cela dans un programme qui n'est pas pour nautilus ou similaire. C'est pour un projet individuel.
Kaz Wolfe
Je pense que vous avez pensé à mettre en place un tri naturel? Mais je comprends, renommer des fichiers est assez facile et si ça fait l'affaire, super :)
Fabian Blechschmidt

Réponses:

35

Ubuntu est livré avec un script appelé rename. C'est juste un petit script Perl qui comporte un certain nombre de puissantes fonctionnalités de renommage en bloc, 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 printfréponses de style ici, mais tout est géré pour nous. Le code ci-dessus est pour un nombre à 5 chiffres (y compris un nombre variable de zéros en tête).

Il recherchera et remplacera la première chaîne de nombres qu'il trouve par une version à remplissage nul et laissera le reste du nom de fichier seul. Cela signifie que vous n'avez pas à vous soucier trop de reporter une extension ou un préfixe.

Remarque: ce n'est pas complètement portable. De nombreuses distributions utilisent rename.ulle util-linuxpackage comme renamebinaire par défaut . Il s'agit d'une alternative considérablement retardée (voir man rename.ul) qui ne comprend pas ce qui précède. Si vous le souhaitez 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
Oli
la source
Si j'étais Perl, ce serait la solution parfaite. Vraiment bien.
MGP
2
Il n'utilise aucun perl, juste un outil fourni qui est déjà écrit en perl.
Rob
1
Dans ce cas , il n'implique une seule commande Perl mais pas exactement soulever des objets lourds. en Perl se comporte de la même manière que dans d'autres langues. sprintfsprintf
Oli
21
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 les noms sont des nombres (suivis d'un point) sont renommés.
  • printf "%.5d" NUMBER ajoute les zéros de tête
  • "${f%.*}" coupe l'extension (.jpg) et ne laisse que le nombre
  • .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. Le remplissage à gauche des zéros de tête des fichiers non numérotés nécessiterait 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

Rendre la commande plus sûre en s'assurant que seuls les noms de fichiers qui sont des nombres sont renommés. Notez que tous les fichiers préexistants nommés comme 00001.jpg seront remplacés.

sмurf
la source
Ce script unique fonctionne «prêt à l'emploi» sur Ubuntu et d'autres distributions Linux! 😃 Pas besoin d'installer des outils supplémentaires en utilisant perl, python, etc.
HEXcube
6

Ci-dessous un script python.

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

La combinaison de différentes extensions en une seule action de renommage peut ajouter une certaine commodité. 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 d'accès correct au répertoire de fichiers ( sourcedir), le nombre de chiffres que vous souhaitez que les nouveaux noms aient ( number_ofdigits) et l'extension (s) 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 dans le répertoire et ajoute des zéros de tête jusqu'à 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])
Jacob Vlijm
la source
2

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

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

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

Mats Kindahl
la source
0

Il existe une interface graphique qui le fera, appelée pyRenamer, qui peut être trouvée dans les référentiels. Installez, démarrez, sélectionnez votre répertoire et définissez 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.

user287888
la source
Bien que votre réponse fonctionne, veuillez noter qu'il s'agit d'une shell-scriptingsection, ce qui signifie que je recherche une réponse en ligne de commande. Pouvez-vous également fournir plus de détails sur le programme? Par exemple, quel est le format de motif {num5}?
Kaz Wolfe
-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

C'est grossier, car il ne fait pas le renommage intelligemment, devra penser à une astuce pour cela. Mais cela devrait vous aider à trier les choses.

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

Swarnendu Biswas
la source
2
il renomme 1439.jpg par 0001439.jpg.
Avinash Raj
Oui, je sais, juste des zéros supplémentaires rembourrés qui devraient toujours fonctionner avec le tri.
Swarnendu Bis était