T'as un répertoire avec pleins d'images, et tu
veux les renommer du genre 1.jpg, 2.jpg, etc. Ben
voilà la solution :
> cd ton_répertoire
> ls -A | awk 'BEGIN{n=1}
{system("mv "$1" "n".jpg");n=n+1}'
quand on fait `find ...` , le shell va remplacer l'expression `find ...` par son resultat sur la ligne de commande, mais voila la ligne de commande c'est un buffer de taille maxi fixe, et en cas d'overflow le shell va simplement limiter la reponse a la taille de son buffer, silencieusement.
du coup t'es pas sur que les derniers fichiers soient traités !!!
les construction en
for i in ` ......`
voire meme
for i in *.txt
sont a banir des qu'on ne peut pas presumer de la taille de *.txt en caracteres. (si un pignouf a cree des fichier avec des noms de 200 caracteres ca peut aller vite ... si un pignouf a cree 5000 fichiers dans le repertoire, meme probleme.
Sauf que les gars qui ecrivent des shell, eux, ne sont pas des pignoufs, et que même avec 100000 « items » de 200 caractères chacun, zsh, bash et même ash s'en sortent très bien :
for i in `perl -e '$a="."x200; map {print "$a$_ "} (1..100000)'`; do echo $i; done
D'ailleurs c'est marrant mais zsh met 3"32 qand bash met 8.7 secondes et ash 4.2 secondes seulement... Vais peut-être bien mettre ash en /bin/sh moa.
{} correspond au nom du fichier/repertoire trouve
le ; (l'espace devant est obligatoire) conclut ta commande
les apostrophes permettent d'echapper pour pas que le shell les interprete. les \ marchent aussi mais je trouve ca moins lisible:
merci pour l'astuce bien bien pratique. Je vais maintenant tenter de trouver une réponse à la hauteur de ma nullité, soit: afficher les images dans l'ordre croissant (pas 10 11 12 etc... 1 20 21 ...
> Je vais maintenant tenter de trouver une réponse à la hauteur de ma nullité, soit: afficher les images dans l'ordre croissant (pas 10 11 12 etc... 1 20 21 ...
Essaie : $ ls -v
(-v comme affichage en mode version ; à ne pas confondre avec --version qui donne la version de ls :)
Chez moi ça marche (bien que ça ne soit pas indiqué dans le man ; ls (GNU fileutils) 4.0.36) !
Il faut faire très attention à une chose avec cette commande.
Vérifiez avant de la lancer que vous n'allez pas renommer un fichier vers un fichier qui existe déjà.
Cette ligne de commande pose des problèmes avec les noms e fichiers contenant des espaces, j'ai donc du faire un script.
Le voici :
#!/bin/bash
#on récupère l'extention des fichiers à renomer, mp3 par defaut
ext="mp3"
if [ ! -z $1 ] ; then
ext=$1
fi
NUM=0
# on liste les fichiers par ordre alphabétique en intérprétant
# "intéligemment" les chiffres
for file in `ls -Av *.$ext`
do
let NUM="$NUM + 1"
# si le chiffre est inférieur à 10, on rajoute le 0
if [ ${NUM} -lt 10 ]; then
I="0""$NUM"
else
I="$NUM"
fi
# on renome
mv "$file" $I.$ext
done
Oui toutes ces modifs sont sympatoches....
Seulement voila...si on utilise du PNG ou si on attend 2004 pour mettre des GIF dans le répertoire, ça risque de donner des choses joyeuses du genre un PNG avec une extension JPG
L'équivalent de la solution proposée :
cd ton_répertoire
\ls -A | perl -e '$n = 0; while (<>) { chomp; rename $_, ++$n.".jpg"; }'
Sans renommer les fichiers commençant par un point ni les répertoires, et en conservant les suffixes pour les fichiers qui en ont :
cd ton_répertoire
perl -e '$n = 0; while (<*>) { -f $_ and rename $_, ++$n.(/^.*(\.[^.]{1,4})$/ ? $1 : ".jpg"); }'
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
Plus concis, en utilisant notamment les options de ligne de commande de Perl :
cd ton_repertoire; \ls -A | perl -nle 'rename $_, ++$n.".jpg"'
En faisant attention à ne pas renommer les répertoires, les fichiers commençant par un point et les fichiers comportant déjà une extension autre que .jpg ou .jpeg :
cd ton_repertoire; \ls -A | perl -nle '-f and (! /^\.|\.[^.]{1,4}$/ || /^[^\.].*\.jpe?g$/i) and rename $_, ++$n.".jpg"'
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
J'ai écrit : cd ton_repertoire; \ls -A | perl -nle '-f and (! /^\.|\.[^.]{1,4}$/ || /^[^\.].*\.jpe?g$/i) and rename $_, ++$n.".jpg"'
Dans le fond, plutôt ça :
cd ton_repertoire; \ls -A | perl -nle '-f and ! /\.[^.]{1,4}$/ || /\.jpe?g$/ and /^([^.].*)(\.(jpe?g)?)?$/i and rename $1, ++$n.".jpg"'
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
# Re: Pour renommer des fichiers avec des chiffres
Posté par Fabien Penso (site web personnel, Mastodon) . Évalué à 1.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Fabien Seisen . Évalué à 1.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Whaly (site web personnel) . Évalué à 1.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Anonyme . Évalué à 1.
Ca demande d'installer un logiciel en plus.
Sinon, moi j'aurais plutot fait
NUM=0
for file in *.jpg; do
NUM=`expr 1 + $NUM`
mv "$file" $NUM.jpg
done
Ca me parait etre ce qu'il y a de plus simple...
[^] # optimisation
Posté par Francois Revol (site web personnel) . Évalué à 1.
ou encore
NUM=$(($NMU + 1))
ce qui a le mérite de ne pas lancer /bin/expr (commande externe) à chaque itération :)
[^] #
Posté par Francois Revol (site web personnel) . Évalué à 1.
ou encore
NUM=$(($NUM + 1))
ce qui a le mérite de ne pas lancer /bin/expr (commande externe) à chaque itération :)
[^] # p*** d'Opera
Posté par Francois Revol (site web personnel) . Évalué à 1.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par shaftman . Évalué à 1.
ls -A | awk '{system("echo "$1 " " NR ".jpg")}'
NR est une variable interne qui retourne la ligne courante, on economise le bloc BEGIN et l'incrémentation.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par khildram . Évalué à 1.
Par contre :
ls -A | awk '{system("mv "$1 " "$1 NR ".jpg")}'
va permettre d'ajouter aux noms de fichiers l'extension <numéro>.jpg
et :
ls -A | awk '{system("mv "$1 " " NR ".jpg")}'
va permettre de renommer les fichiers en : <numéro>.jpg
sinon, c'est vrai que c'est un peu plus optimisé. De cette manière, pas besoin de créer une variable et de l'incrémenter, c'est bien vu !
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par troglo . Évalué à 1.
for repertoire in `find ./ -maxdepth 1 -type d`
do echo $repertoire
done
mais ca ne marche pas des qu'un repertoire a un espace dans son nom.
quelqu'un a une idee ?
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par shaftman . Évalué à 1.
find ./ -maxdepth 1 -type d | while read repertoire; do
echo $repertoire
done
Le while read est également très pratique pour lire des fichiers ligne à ligne contenant des blancs.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par PLuG . Évalué à 1.
quand on fait `find ...` , le shell va remplacer l'expression `find ...` par son resultat sur la ligne de commande, mais voila la ligne de commande c'est un buffer de taille maxi fixe, et en cas d'overflow le shell va simplement limiter la reponse a la taille de son buffer, silencieusement.
du coup t'es pas sur que les derniers fichiers soient traités !!!
les construction en
for i in ` ......`
voire meme
for i in *.txt
sont a banir des qu'on ne peut pas presumer de la taille de *.txt en caracteres. (si un pignouf a cree des fichier avec des noms de 200 caracteres ca peut aller vite ... si un pignouf a cree 5000 fichiers dans le repertoire, meme probleme.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Matafan . Évalué à 1.
for i in `perl -e '$a="."x200; map {print "$a$_ "} (1..100000)'`; do echo $i; done
D'ailleurs c'est marrant mais zsh met 3"32 qand bash met 8.7 secondes et ash 4.2 secondes seulement... Vais peut-être bien mettre ash en /bin/sh moa.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par dilbert78900 . Évalué à 1.
find / -type d -exec echo '{}' ';'
{} correspond au nom du fichier/repertoire trouve
le ; (l'espace devant est obligatoire) conclut ta commande
les apostrophes permettent d'echapper pour pas que le shell les interprete. les \ marchent aussi mais je trouve ca moins lisible:
find / -type d -exec echo \{\} \;
# Re: Pour renommer des fichiers avec des chiffres
Posté par graviers . Évalué à 1.
:-)
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par tzeentch00 . Évalué à 1.
Essaie :
$ ls -v
(-v comme affichage en mode version ; à ne pas confondre avec --version qui donne la version de ls :)
Chez moi ça marche (bien que ça ne soit pas indiqué dans le man ; ls (GNU fileutils) 4.0.36) !
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par yoho (site web personnel) . Évalué à 1.
Bravo, tu mérites un + .... Ah j'ai pas le droit, bon tans pis.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Olivier Rioland . Évalué à 1.
ls -A | awk '{num=printf("%4.4d",NR);system("echo "$1 " " num ".jpg")}'
Ainsi les fichiers s'appelleraient '0001.jpg', '0002.jpg' ...
OK, ça limite à environ 10000 photos, mais c'est juste pour le principe ...
# Re: Pour renommer des fichiers avec des chiffres
Posté par seginus . Évalué à 1.
Vérifiez avant de la lancer que vous n'allez pas renommer un fichier vers un fichier qui existe déjà.
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par TemPi . Évalué à 1.
# Re: Pour renommer des fichiers avec des chiffres
Posté par cliklik . Évalué à 1.
Le voici :
#!/bin/bash
#on récupère l'extention des fichiers à renomer, mp3 par defaut
ext="mp3"
if [ ! -z $1 ] ; then
ext=$1
fi
NUM=0
# on liste les fichiers par ordre alphabétique en intérprétant
# "intéligemment" les chiffres
for file in `ls -Av *.$ext`
do
let NUM="$NUM + 1"
# si le chiffre est inférieur à 10, on rajoute le 0
if [ ${NUM} -lt 10 ]; then
I="0""$NUM"
else
I="$NUM"
fi
# on renome
mv "$file" $I.$ext
done
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par cliklik . Évalué à 1.
Je n'ai pas déroulé tous les tests d'intégration et j'ai laissé passé un "bug"
> for file in `ls -Av *.$ext`
ça ne marche pas
=> il faut utiliser à la place :
for file in *.$ext
mais dans ce cas-là, on perd le -v du ls :( (le intéligemment du commentaire)
pffff
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Arachne . Évalué à 1.
# Re: Pour renommer des fichiers avec des chiffres
Posté par Keos . Évalué à 1.
Seulement voila...si on utilise du PNG ou si on attend 2004 pour mettre des GIF dans le répertoire, ça risque de donner des choses joyeuses du genre un PNG avec une extension JPG
[^] # Re: Pour renommer des fichiers avec des chiffres
Posté par Keos . Évalué à 1.
# Avec Perl
Posté par Arthur Accroc . Évalué à 1.
cd ton_répertoire
\ls -A | perl -e '$n = 0; while (<>) { chomp; rename $_, ++$n.".jpg"; }'
Sans renommer les fichiers commençant par un point ni les répertoires, et en conservant les suffixes pour les fichiers qui en ont :
cd ton_répertoire
perl -e '$n = 0; while (<*>) { -f $_ and rename $_, ++$n.(/^.*(\.[^.]{1,4})$/ ? $1 : ".jpg"); }'
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
[^] # Re: Avec Perl
Posté par Arthur Accroc . Évalué à 1.
cd ton_repertoire; \ls -A | perl -nle 'rename $_, ++$n.".jpg"'
En faisant attention à ne pas renommer les répertoires, les fichiers commençant par un point et les fichiers comportant déjà une extension autre que .jpg ou .jpeg :
cd ton_repertoire; \ls -A | perl -nle '-f and (! /^\.|\.[^.]{1,4}$/ || /^[^\.].*\.jpe?g$/i) and rename $_, ++$n.".jpg"'
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
[^] # Re: Avec Perl
Posté par Arthur Accroc . Évalué à 1.
cd ton_repertoire; \ls -A | perl -nle '-f and (! /^\.|\.[^.]{1,4}$/ || /^[^\.].*\.jpe?g$/i) and rename $_, ++$n.".jpg"'
Dans le fond, plutôt ça :
cd ton_repertoire; \ls -A | perl -nle '-f and ! /\.[^.]{1,4}$/ || /\.jpe?g$/ and /^([^.].*)(\.(jpe?g)?)?$/i and rename $1, ++$n.".jpg"'
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
# Re: Pour renommer des fichiers avec des chiffres
Posté par Jerome Alet (site web personnel) . Évalué à 1.
http://www.librelogiciel.com/software/DigicaMerge/action_Presentati(...)
qui offre de très nombreuses options particulièrement puissantes pour ce genre de traitement...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.