web-dev-qa-db-fra.com

Linux renommer les fichiers en majuscules

J'ai un grand nombre de fichiers au format x00000.jpg, X00000.jpg et xx00000.jpg.

Comment puis-je renommer ces fichiers afin qu'ils soient tous en majuscules, en ignorant la partie numérique du nom?

20
Jay
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
21
damienfrancois

Vous ne pouvez pas renommer des fichiers à partir de Bash uniquement, car Bash n’a pas de commande intégrée pour renommer des 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 ou plus de fichiers, les solutions ci-dessus sont rapides et les solutions ci-dessous sont 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, 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 en .JPG à la fin, mais vous pouvez les modifier pour éviter cela.

12
pts

Le shell bash a une syntaxe permettant de traduire un nom de variable en majuscule.

for file in * ; do      # or *.jpg, or x*.jpg, or whatever
    mv $file ${file^^}
done

Je pense que cette fonctionnalité est peut-être assez nouvelle. Vérifiez donc tout d'abord que votre version de bash l'implémente. Pour éviter les erreurs, essayez une fois de remplacer mv par echo mv, juste pour vous assurer que vous obtiendrez ce que vous voulez.

La documentation de cette fonctionnalité est ici , ou tapez info bash et recherchez "upper".

Vous devriez probablement décider quoi faire si le fichier cible existe déjà (par exemple, si x00000.jpg et X00000.JPG existent 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 toutes les lignes ne commençant pas par 1.

8
Keith Thompson

La combinaison des réponses précédentes pourrait donner:

for file in * ; do            # or *.jpg, or x*.jpg, or whatever
   basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
   newname="$basename.${file#*.}"
   mv "$file" "$newname"
done
7
Wiley

En utilisant tr:

f="x00000.jpg"
n="${f%.*}"
n=$(tr '[:lower:]' '[:upper:]' <<< "$n")
f="$n.${f#*.}"
echo "$f"

SORTIE:

X00000.jpg
3
anubhava

rename

Le moyen le plus simple consiste probablement à rename plusieurs fichiers. Pour traduire les noms minuscules en majuscules, vous devez:

rename 'y/a-z/A-Z/' *

Références

2
Pablo Bianchi

Si vous ne souhaitez que renommer des fichiers/répertoires, vous pouvez utiliser rnm :

rnm -rs '/./\C/g' -fo -dp -1 *

Explication:

  1. -rs: remplace la chaîne. /./\C/g remplace toutes les correspondances de . (regex) par des majuscules.
  2. -fo: mode fichier uniquement
  3. -dp: profondeur du répertoire (-1 signifie illimité).

Plus d'exemples peuvent être trouvés ici .

0
Jahid