web-dev-qa-db-fra.com

Renommer des fichiers d'un dossier en numéros séquentiels

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).

184
Gnutt

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.

261
gauteh

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.

180
user4434168

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.).

60
Pero

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.

28
beibei2

avec la commande "renommer"

rename -N 0001 -X 's/.*/$N/' *.jpg

ou

rename -N 0001 's/.*/$N.jpg/' *.jpg
24
Roman Rhrn Nesterov

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

21
Roy Shilkrot

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
11
Abdala Cerqueira

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.
8
Luke H

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
6
trisweb

Vous pouvez aussi utiliser ls

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
1
bartburkhardt

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 
1
Ruslan Gerasimov

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.

1
Michael Schmid

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! 

numéroter

@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.

1
Paul Weibert
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

1
maXp

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' *
0
OzzyCzech

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
0
Flavio Aiello
a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done
0
Shubh

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 \)

0
Frank Nocke

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); 
}
0
Andy Beverley

Si vous utilisez Annotator pour étiqueter les images.

$ make qt5py3

$ python3 labelImg.py

0

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 jpeg
  • gawk '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écute

Soyez 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.

0
nintendojet