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
à 0001.jpg
, wrjr3.jpg
à 0002.jpg
et ainsi de suite, le nombre de zéros à gauche dépendant du nombre total de fichiers (pas besoin de zéros supplémentaires s'ils ne sont pas nécessaires).
Essayez d’utiliser une boucle, let
et printf
pour le remplissage:
a=1
for i in *.jpg; do
new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
mv -i -- "$i" "$new"
let a=a+1
done
l'utilisation de l'indicateur -i
empêche d'écraser automatiquement les fichiers existants.
La beauté en une ligne
ls -v | cat -n | while read n f; do mv "$f" "$n.ext"; done
changez le fichier .ext avec le fichier .png, .jpg ou autre.
J'aime la solution de gauteh pour sa simplicité, mais elle présente un inconvénient important. Lorsque vous exécutez des milliers de fichiers, vous pouvez obtenir le message "liste d'arguments trop longue" ( plus d'informations à ce sujet ), et deuxièmement, le script peut devenir très lent. Dans mon cas, le lancer sur environ 36 000 fichiers, le script a été déplacé d’environ un article par seconde! Je ne sais pas vraiment pourquoi cela se produit, mais la règle que j'ai obtenue de mes collègues était "find
est ton ami".
find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
Pour compter les éléments et construire la commande, gawk a été utilisé. Notez la différence principale, cependant. Par défaut, find
recherche les fichiers du répertoire en cours et de ses sous-répertoires. Veillez donc à limiter la recherche au répertoire en cours uniquement, si nécessaire (utilisez man find
pour voir comment.).
l’utilisation de la solution de Pero sur OSX a nécessité quelques modifications. J'ai utilisé:
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
note: les barres obliques inverses sont là pour la continuation de la ligne
edit 20 juillet 2015: Incorporé les commentaires de @ klaustopher pour citer l'argument \"%s\"
de la commande mv
afin de prendre en charge les noms de fichiers avec des espaces.
avec la commande "renommer"
rename -N 0001 -X 's/.*/$N/' *.jpg
ou
rename -N 0001 's/.*/$N.jpg/' *.jpg
Un très simple bash liner qui conserve les extensions originales, ajoute des zéros non significatifs et fonctionne également sous OSX:
num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done
Version simplifiée de http://ubuntuforums.org/showthread.php?t=1355021
Pour travailler dans toutes les situations, mettez un\"pour les fichiers avec un espace dans le nom
find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
Si votre rename
ne supporte pas -N
, vous pouvez faire quelque chose comme ceci:
ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'
Edit Pour commencer avec un numéro donné, vous pouvez utiliser le code (quelque peu laid) ci-dessous, il suffit de remplacer 123 par le numéro souhaité:
ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'
Cela répertorie les fichiers par ordre de date de création (les plus récents en premier, ajoutez -r
à ls pour effectuer un tri inversé), puis envoie cette liste de fichiers à renommer. Rename utilise le code Perl dans la regex pour formater et incrémenter le compteur.
Cependant, si vous utilisez des images JPEG avec des informations EXIF, je vous recommande exiftool
Ceci est tiré de exiftool documentation , sous "Exemples de changement de nom"
exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
preserving the original file extension (%e). Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.
Sous OSX , installez le script de changement de nom d'Homebrew:
brew install rename
Ensuite, vous pouvez le faire très facilement et ridiculement:
rename -e 's/.*/$N.jpg/' *.jpg
Ou pour ajouter un préfixe Nice:
rename -e 's/.*/photo-$N.jpg/' *.jpg
Vous pouvez aussi utiliser ls
ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
Utilisez à nouveau la solution de Pero avec peu de modifications, car find
traversera l’arborescence de répertoires dans l’ordre, les éléments de commande étant stockés dans les entrées de répertoire. Cela sera (généralement) cohérent d'une exécution à l'autre, sur le même ordinateur et sera essentiellement "ordre de création de fichier/répertoire" s'il n'y a pas eu de suppression.
Cependant, dans certains cas, vous devez obtenir un ordre logique, par exemple, par nom, qui est utilisé dans cet exemple.
find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
Supposons que nous avons ces fichiers dans un répertoire, classé par ordre de création, le premier étant le plus ancien:
a.jpg
b.JPG
c.jpeg
d.tar.gz
e
alors ls -1cr
affiche exactement la liste ci-dessus. Vous pouvez ensuite utiliser rename
:
ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'
qui sort
rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)
L'avertissement "utilisation de la valeur non initialisée […]" s'affiche pour les fichiers sans extension; vous pouvez l'ignorer.
Supprimez -n
de la commande rename
pour appliquer le renommage.
Cette réponse s’inspire de La réponse de Luke d’avril 2014 . Il ne tient pas compte de la nécessité de Gnutt de définir le nombre de zéros non significatifs en fonction du nombre total de fichiers.
J'ai eu un problème similaire et écrit un script Shell pour cette raison. J'ai décidé de l'afficher malgré le fait que beaucoup de bonnes réponses avaient déjà été postées, car je pense que cela peut être utile pour quelqu'un N'hésitez pas à l'améliorer!
@Gnutt Le comportement souhaité peut être obtenu en tapant ce qui suit:
./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r
Si l'option -r
est omise, l'alésage ne sera que simulé (devrait être utile pour les tests).
L'action L décrit la longueur du numéro cible (qui sera rempli de zéros) Il est également possible d'ajouter un préfixe/suffixe avec les options -p <prefix>
-s <suffix>
.
Si quelqu'un souhaite que les fichiers soient triés numériquement avant d'être numérotés, supprimez simplement l'option -o modtime
.
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'
renommer -vn - supprimer n pour le mode test off
{$ i = 1;} - numéro de début de contrôle
"% 04d.jpg" - Nombre de contrôles zéro 04 et définition de l'extension de la sortie .jpg
Suivez la commande pour renommer tous les fichiers en séquence et également en minuscule:
rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *
Cet oneliner répertorie tous les fichiers du répertoire en cours, trie par horodatage de création dans l'ordre inverse (le fichier le plus ancien est au début) et renomme automatiquement avec des zéros de fin, en fonction du nombre de fichiers. L'extension de fichier sera préservée.
Je n'ai généralement qu'un seul dossier depuis des années pour les photos et les films sur téléphone portable. En appliquant cette commande, mes images et mes vidéos sont prêtes pour un diaporama dans le bon ordre sur le téléviseur ou pour l'archivage.
Sachez que si vous avez des conflits de noms de fichiers, vous perdez des fichiers. Donc, commencez par renommer quelque chose de bizarre comme temp001.jpg
, puis exécutez-le avec le nom de fichier final.
DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done
a=1
for i in *.jpg; do
mv -- "$i" "$a.jpg"
a=`expr $a + 1`
done
Trié par heure, limité au jpg, aux zéros et au nom de base (au cas où vous en voudriez probablement un):
ls -t *.jpg | cat -n | \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done
(tous sur une seule ligne, sans le \
)
La plupart des autres solutions écraseront les fichiers existants déjà nommés par un numéro. Cela est particulièrement problématique si vous exécutez le script, ajoutez d'autres fichiers, puis réexécutez le script.
Ce script renomme d’abord les fichiers numériques existants:
#!/usr/bin/Perl
use strict;
use warnings;
use File::Temp qw/tempfile/;
my $dir = $ARGV[0]
or die "Please specify directory as first argument";
opendir(my $dh, $dir) or die "can't opendir $dir: $!";
# First rename any files that are already numeric
while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh))
{
for my $old (@files) {
my $ext = $old =~ /(\.[^.]+)$/ ? $1 : '';
my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext);
close $fh;
rename "$dir/$old", $new;
}
}
rewinddir $dh;
my $i;
while (my $file = readdir($dh))
{
next if $file =~ /\A\.\.?\z/;
my $ext = $file =~ /(\.[^.]+)$/ ? $1 : '';
rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext);
}
Si vous utilisez Annotator pour étiqueter les images.
$ make qt5py3
$ python3 labelImg.py
Pour moi, cette combinaison de réponses a parfaitement fonctionné:
ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
ls -v
aide à commander 1 10 9 dans l'ordre correct: 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++ }'
renumérote avec 4 caractères et zéros à gauche. En évitant mv, je n’essaye pas d’écraser accidentellement tout ce qui existe déjà en ayant accidentellement le même numéro.bash
exécuteSoyez conscient de ce que @xhienne a dit, rediriger 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.