Le bash
shell a une syntaxe pour traduire un nom de variable en majuscules.
for file in * ; do # or *.jpg, or x*.jpg, or whatever
mv "$file" "${file^^}"
done
Cette fonctionnalité a été introduite dans la version 4.0 de bash, vérifiez donc d'abord que votre version de bash
le met en œuvre. Pour éviter les erreurs, essayez-le une fois en remplaçant mv
par echo mv
, juste pour s'assurer qu'il va faire ce que vous voulez.
La documentation de cette fonctionnalité est ici, ou tapez info bash
et recherchez "supérieur".
Vous devriez probablement décider quoi faire si le fichier cible existe déjà (par exemple, si les deux x00000.jpg
et X00000.JPG
existe déjà), sauf si vous êtes certain que ce n'est pas un problème. Pour détecter de telles collisions de noms, vous pouvez essayer :
ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n
et recherchez les lignes ne commençant pas par 1
.
rename
Le moyen le plus simple de renommer plusieurs fichiers consiste probablement à utiliser le rename
de Perl . Pour traduire les noms en minuscules en majuscules, procédez comme suit :
rename 'y/a-z/A-Z/' *
Si les fichiers sont également dans des sous-répertoires, vous pouvez utiliser globstar ou find
:
find . -maxdepth 1 -type f -iname "*.jpg" -execdir rename "y/a-z/A-Z/" {} +
Références
- Tutoriel :Linux renommer plusieurs fichiers à l'invite du shell – nixCraft
- Plus d'informations sur
y/
, traduire au lieu de s remplaçant. - DistroTube - Outils pour renommer des fichiers sous Linux
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
Vous ne pouvez pas renommer les fichiers à partir de Bash uniquement, car Bash n'a pas de commande intégrée pour renommer les fichiers. Vous devez utiliser au moins une commande externe pour cela.
Si Perl est autorisé :
perl -e 'for(@ARGV){rename$_,uc}' *.jpg
Si Python est autorisé :
python -c 'import os, sys; [os.rename(a, a.upper()) for a in sys.argv[1:]]' *.jpg
Si vous avez des milliers de fichiers ou plus, les solutions ci-dessus sont rapides et les solutions ci-dessous sont sensiblement plus lentes.
Si AWK, ls
et mv
sont autorisés :
# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"$0"\x27 \x27"toupper($0)"\x27"}')"
Si vous avez beaucoup de fichiers, les solutions ci-dessus ne fonctionnent pas, car *.jpg
se développe en une liste d'arguments trop longue (erreur :Liste d'arguments trop longue ).
Si tr
et mv
sont autorisés, alors voir la réponse de Damienfrancois.
Si mv
est autorisé :
for file in *; do mv -- "$file" "${file^^}"; done
Veuillez noter que ceux-ci renomment .jpg
à .JPG
à la fin, mais vous pouvez les modifier pour éviter cela.