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.