Je veux renommer les fichiers d'un répertoire en numéros séquentiels. Basé sur la date de création des fichiers.
Par exemple, sadf.jpg
pour 0001.jpg
, wrjr3.jpg
vers 0002.jpg
et ainsi de suite, le nombre de zéros non significatifs en fonction de la quantité totale de fichiers (pas besoin de zéros supplémentaires s'ils ne sont pas nécessaires).
bash
rename
batch-rename
Gnutt
la source
la source
Réponses:
Essayez d'utiliser une boucle,,
let
etprintf
pour le rembourrage:l'utilisation de l'
-i
indicateur empêche d'écraser automatiquement les fichiers existants.la source
printf -v new "%04d.jpg" ${a}
pour mettre la valeur dans la variable. Et((a++))
fonctionne pour incrémenter la variable. De plus, cela ne le fait pas dans l'ordre de la date de création ou ne minimise pas le remplissage, ce qui est spécifié par l'OP. Cependant, il convient de noter que Linux / Unix ne stocke pas de date de création.mv -- "$i" "$new"
pour gérer correctement les noms de fichiers source qui commencent par des tirets; tel quel,mv
essaiera d'analyser ces noms de fichiers en tant que collections de drapeaux.-i
devrait être inclus dans la réponse et la note devrait être réécrite en conséquence. ce sera plus sûr. :(La beauté en une seule ligne:
Vous pouvez changer
.ext
avec.png
,.jpg
etc.la source
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
avoir zéro numéros matelassés-n
à la commande mv pour éviter d'écraser accidentellement des fichiers. Découvert à la dure!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Résultats: (1) triés par ordre de modification, fichiers ultérieurs avec index ultérieurs; (2) ignore les répertoires - et n'est pas récursif; (3) index de tampons; (4) conserve l'extension d'origine.J'aime la solution de gauteh pour sa simplicité, mais elle a un inconvénient important. Lors de l'exécution sur des milliers de fichiers, vous pouvez obtenir un message "liste d'arguments trop longue" ( plus à ce sujet ), et deuxièmement, le script peut devenir très lent. Dans mon cas, en l'exécutant sur environ 36 000 fichiers, le script s'est déplacé d'environ. un article par seconde! Je ne sais pas vraiment pourquoi cela se produit, mais la règle que j'ai reçue de mes collègues était "
find
est votre ami" .Pour compter les objets et construire la commande, gawk a été utilisé. Notez cependant la principale différence. Par défaut,
find
recherche les fichiers dans le répertoire en cours et ses sous-répertoires, assurez-vous donc de limiter la recherche sur le répertoire en cours uniquement, si nécessaire (utilisezman find
pour voir comment).la source
NR
pour une commande plus courte.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
boucle ne prend pas 1 seconde par fichier à proprement parler. Il faut beaucoup de temps pour extraire les 36 000 noms de fichiers du système de fichiers, puis les boucler assez rapidement. De nombreux systèmes de fichiers ont des problèmes avec les grands répertoires, quelles que soient les commandes précises que vous exécutez; mais généralement,find
il sera plus rapide qu'un caractère générique de shell, car il doit extraire et trier la liste des fichiers correspondants.avec la commande "renommer"
ou
la source
rename
(Linux Mint 13) n'a pas d'-N
option.rename
commande, mais je ne l'ai jamais su-N
! Merci!rename
. Le lien publié par @Bostrot est encore un autre outil de renommage et il semble que @RomanRhrnNesterov l'ait utilisé. ¶ A tous les utilisateurs derename
par Peder Stray et Larry Wall (packageperl-rename
sur arch linux et packagerename
sur debian / ubuntu): Vous pouvez$N
vous définir :perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
l'utilisation de la solution de Pero sur OSX a nécessité quelques modifications. J'ai utilisé:
note: les barres obliques inverses sont là pour la suite de la ligne
modifier 20 juillet 2015: incorporé les commentaires de @ klaustopher pour citer l'
\"%s\"
argument de lamv
commande afin de prendre en charge les noms de fichiers avec des espaces.la source
$(rm -rf /).jpg
.mv
. Si vous avez un fichier nommé iesome thing.jpg
votre script échoue. Voici ce que j'ai utilisé:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
pour travailler uniquement sur jpgs dans le répertoire courant, car il vaut mieux être prudent que désolé.ls -1 *.jpg
au lieu de trouver, sinon il ne sera pas trié. Ou ajoutez un|sort|
avant awkUn liner bash one très simple qui conserve les extensions d'origine, ajoute des zéros de tête et fonctionne également sous OSX:
Version simplifiée de http://ubuntuforums.org/showthread.php?t=1355021
la source
9.ext
avant11.ext
, mais d'autres outils (commels
) ne le feront pas non plus.Pour travailler dans toutes les situations, mettez un \ "pour les fichiers qui ont de l'espace dans le nom
la source
$(rm -rf /)
sont toujours respectées.Si votre
rename
ne prend pas en charge-N
, vous pouvez faire quelque chose comme ceci:Modifier Pour commencer avec un numéro donné, vous pouvez utiliser le code (quelque peu laid) ci-dessous, remplacez simplement 123 par le numéro que vous voulez:
Cela répertorie les fichiers par date de création (le plus récent en premier, ajoutez
-r
à ls pour inverser le tri), puis envoie cette liste de fichiers à renommer. Renommer utilise du code perl dans l'expression régulière pour formater et incrémenter le compteur.Cependant, si vous avez affaire à des images JPEG avec des informations EXIF, je recommanderais
exiftool
Ceci provient de la documentation exiftool , sous "Renommer des exemples"
la source
rename
?Sur OSX , installez le script de renommage depuis Homebrew:
Ensuite, vous pouvez le faire très ridiculement facilement:
Ou pour ajouter un joli préfixe:
la source
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Suivez la commande renommez tous les fichiers en séquence et également en extension minuscule:
la source
J'ai eu un problème similaire et j'ai écrit un script shell pour cette raison. J'ai décidé de le publier, même si de nombreuses bonnes réponses ont déjà été publiées, car je pense que cela peut être utile pour quelqu'un. N'hésitez pas à l'améliorer!
numéroter
@Gnutt Le comportement souhaité peut être obtenu en tapant ce qui suit:
Si l'option
-r
est omise, l'alésage sera uniquement simulé (devrait être utile pour les tests).L'otion L décrit la longueur du numéro cible (qui sera rempli de zéros de tête) il est également possible d'ajouter un préfixe / suffixe avec les options
-p <prefix>
-s <suffix>
.Dans le cas où quelqu'un souhaite que les fichiers soient triés numériquement avant d'être numérotés, supprimez simplement l'
-o modtime
option.la source
la source
Supposons que nous ayons ces fichiers dans un répertoire, classés par ordre de création, le premier étant le plus ancien:
ls -1cr
affiche ensuite exactement la liste ci-dessus. Vous pouvez ensuite utiliserrename
:qui sort
L'avertissement «utilisation d'une valeur non initialisée […]» s'affiche pour les fichiers sans extension; vous pouvez l'ignorer.
Supprimez
-n
de larename
commande pour appliquer réellement le changement de nom.Cette réponse est inspirée de la réponse de Luke d'avril 2014 . Il ignore l'exigence de Gnutt de définir le nombre de zéros non significatifs en fonction de la quantité totale de fichiers.
la source
ls -1tU
pour l'heure de création. Il avait également besoin d'êtrerename
installé, ce que je n'avais pas.Encore une fois, en utilisant la solution de Pero avec peu de modifications, car
find
traversera l'arborescence du répertoire dans l'ordre, les éléments sont stockés dans les entrées du répertoire. Cela sera (principalement) cohérent d'une exécution à l'autre, sur la même machine et sera essentiellement "ordre de création de fichiers / répertoires" s'il n'y a pas eu de suppressions.Cependant, dans certains cas, vous devez obtenir un ordre logique, par exemple, par nom, qui est utilisé dans cet exemple.
la source
blahblah; rm -r * blahblah.jpg
?Trié par heure, limité à jpg, zéros de tête et nom de base (au cas où vous en voudriez probablement un):
(le tout sur une seule ligne, sans le
\
)la source
ls
dans un script.rename -vn - supprime n pour désactiver le mode test
{$ i = 1;} - numéro de début de contrôle
"% 04d.jpg" - contrôlez le décompte zéro 04 et définissez l'extension de sortie .jpg
la source
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Pour moi, cette combinaison de réponses a parfaitement fonctionné:
ls -v
aide à commander 1 10 9 correctement: ordre 1 9 10, évitant les problèmes d'extension de nom de fichier avec jpg JPG jpeggawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
renumbers avec 4 caractères et zéros de tête. En évitant mv, je n'essaie pas accidentellement d'écraser tout ce qui existe déjà en ayant accidentellement le même numéro.bash
exécuteSoyez conscient de ce que @xhienne a dit, canaliser du contenu inconnu vers bash est un risque pour la sécurité. Mais ce n'était pas le cas pour moi car j'utilisais mes photos numérisées.
la source
Vous pouvez également utiliser ls
la source
blahblah; rm -r * blahblah.JPG
?La majorité des autres solutions écraseront les fichiers existants déjà nommés sous forme de nombre. C'est particulièrement un problème si vous exécutez le script, ajoutez plus de fichiers, puis réexécutez le script.
Ce script renomme d'abord les fichiers numériques existants:
la source
Cet oneliner répertorie tous les fichiers du répertoire en cours, les trie par horodatage de création dans l'ordre inverse (signifie que le fichier le plus ancien se trouve au début) et renomme automatiquement avec des zéros de fin en fonction de la quantité de fichiers. L'extension de fichier sera conservée.
Je n'ai généralement qu'un seul dossier depuis des années pour les photos et les films de téléphones portables. En appliquant cette commande, mes photos et films sont prêts pour un diaporama dans le bon ordre sur le téléviseur ou l'archivage.
Sachez que si vous avez des collisions de noms de fichiers, vous perdez des fichiers. Donc, renommez d'abord quelque chose d'étrange
temp001.jpg
, puis exécutez votre nom de fichier final.la source
ls
vaut mieux éviter de courir une fois mais deux fois, mais je ne l'ai pas étudié en profondeur.ls
, c'est pourquoi deux d'entre eux sont nécessaires. 3. Ces commandes sont des one-shot et ne sont pas censées être incluses dans les scripts, donc il y a une raison pour laquelle les gens préfèrent les one-linersVoici ce qui a fonctionné pour moi.
J'ai utilisé la commande rename de sorte que si un fichier contient des espaces au nom de celui-ci, mv commande ne soit pas confondue entre les espaces et le fichier réel.
la source
De nos jours, il y a une option après avoir sélectionné plusieurs fichiers à renommer (j'ai vu dans le gestionnaire de fichiers thunar).
Une invite est fournie avec tous les fichiers dans ce répertoire particulier, il suffit de vérifier avec la section catégorie
la source
Ce script triera les fichiers par date de création sur Mac OS bash. Je l'utilise pour renommer en masse des vidéos. Modifiez simplement l'extension et la première partie du nom.
la source
blahblah; rm -r * blahblah.mp4
?Voici une autre solution avec la commande "renommer":
la source
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
La réponse de Pero m'a amené ici :)
Je voulais renommer les fichiers en fonction du temps car les visionneuses d'images ne montraient pas les images dans l'ordre du temps.
la source
blahblah; rm -r * blahblah.jpg
? Juste un exemple extrême.Si vous utilisez Image Annotator pour étiqueter les images.
$ make qt5py3
$ python3 labelImg.py
la source
Pour renuméroter 6000, des fichiers dans un dossier, vous pouvez utiliser l'option «Renommer» du programme ACDsee.
Pour définir un préfixe, utilisez ce format:
####"*"
Ensuite, définissez le numéro de début et appuyez sur Renommer et le programme renommera tous les 6000 fichiers avec des numéros séquentiels.
la source