Il bash shell ha una sintassi per tradurre un nome di variabile in tutto maiuscolo.
for file in * ; do # or *.jpg, or x*.jpg, or whatever
mv "$file" "${file^^}"
done
Questa funzione è stata introdotta in bash versione 4.0, quindi prima verifica che la tua versione di bash lo implementa. Per evitare errori, provalo una volta sostituendo mv da echo mv , solo per assicurarti che faccia quello che vuoi.
La documentazione per questa funzione è qui, oppure digita info bash e cerca "superiore".
Probabilmente dovresti decidere cosa fare se il file di destinazione esiste già (ad esempio, se entrambi x00000.jpg e X00000.JPG esiste già), a meno che tu non sia certo che non sia un problema. Per rilevare tali collisioni di nomi, puoi provare:
ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n
e cerca eventuali righe che non iniziano con 1 .
rename
Probabilmente il modo più semplice per rinominare più file è usare il rename di Perl . Per tradurre i nomi minuscoli in maiuscoli, devi:
rename 'y/a-z/A-Z/' *
Se i file sono anche nelle sottocartelle puoi usare globstar o find :
find . -maxdepth 1 -type f -iname "*.jpg" -execdir rename "y/a-z/A-Z/" {} +
Riferimenti
- Guida:Linux rinomina più file al prompt della shell – nixCraft
- Ulteriori informazioni su
y/, traduci invece di s sostituto. - DistroTube - Strumenti per rinominare i file in Linux
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
Non puoi rinominare i file solo da Bash, perché Bash non ha alcun comando integrato per rinominare i file. Devi usare almeno un comando esterno per questo.
Se Perl è consentito:
perl -e 'for(@ARGV){rename$_,uc}' *.jpg
Se Python è consentito:
python -c 'import os, sys; [os.rename(a, a.upper()) for a in sys.argv[1:]]' *.jpg
Se hai migliaia o più file, le soluzioni di cui sopra sono veloci e le soluzioni di seguito sono notevolmente più lente.
Se AWK, ls e mv sono consentiti:
# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"$0"\x27 \x27"toupper($0)"\x27"}')"
Se hai molti file, le soluzioni di cui sopra non funzionano, perché *.jpg si espande in un elenco di argomenti troppo lungo (errore:Elenco di argomenti troppo lungo ).
Se tr e mv sono consentiti, quindi vedi la risposta di damienfrancois.
Se mv è consentito:
for file in *; do mv -- "$file" "${file^^}"; done
Tieni presente che questi rinominano .jpg a .JPG alla fine, ma puoi modificarli per evitarlo.