El bash
shell tiene una sintaxis para traducir un nombre de variable a mayúsculas.
for file in * ; do # or *.jpg, or x*.jpg, or whatever
mv "$file" "${file^^}"
done
Esta característica se introdujo en la versión 4.0 de bash, así que primero verifique que su versión de bash
lo implementa. Para evitar errores, pruébalo una vez reemplazando mv
por echo mv
, solo para asegurarte de que hará lo que quieres.
La documentación para esta característica está aquí, o escriba info bash
y busque "superior".
Probablemente debería decidir qué hacer si el archivo de destino ya existe (por ejemplo, si tanto x00000.jpg
y X00000.JPG
ya existe), a menos que esté seguro de que no es un problema. Para detectar tales colisiones de nombres, puede probar:
ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n
y busque cualquier línea que no comience con 1
.
rename
Probablemente la forma más fácil de cambiar el nombre de varios archivos es usar rename
de Perl. . Para traducir nombres en minúsculas a mayúsculas:
rename 'y/a-z/A-Z/' *
Si los archivos también están en subdirectorios, puede usar globstar o find
:
find . -maxdepth 1 -type f -iname "*.jpg" -execdir rename "y/a-z/A-Z/" {} +
Referencias
- Cómo:Linux cambia el nombre de varios archivos en un indicador de Shell:nixCraft
- Más información sobre
y/
, traducir en lugar de s sustituir. - DistroTube - Herramientas para renombrar archivos en Linux
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
No puede cambiar el nombre de los archivos solo desde Bash, porque Bash no tiene ningún comando integrado para cambiar el nombre de los archivos. Tienes que usar al menos un comando externo para eso.
Si se permite Perl:
perl -e 'for(@ARGV){rename$_,uc}' *.jpg
Si Python está permitido:
python -c 'import os, sys; [os.rename(a, a.upper()) for a in sys.argv[1:]]' *.jpg
Si tiene miles de archivos o más, las soluciones anteriores son rápidas y las soluciones a continuación son notablemente más lentas.
Si es AWK, ls
y mv
están permitidos:
# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"$0"\x27 \x27"toupper($0)"\x27"}')"
Si tiene muchos archivos, las soluciones anteriores no funcionan porque *.jpg
se expande a una lista de argumentos demasiado larga (error:Lista de argumentos demasiado larga ).
Si tr
y mv
están permitidos, luego vea la respuesta de damienfrancois.
Si mv
está permitido:
for file in *; do mv -- "$file" "${file^^}"; done
Tenga en cuenta que estos cambian el nombre de .jpg
a .JPG
al final, pero puedes modificarlos para evitarlo.