Prefacio:
Si no se preocupan por el caso de las extensiones, basta con utilizar la utilidad 'tr' en un bucle shell:
for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done
Si no se preocupan por el caso de las extensiones, entonces usted debe ser consciente de que hay más de una forma de hacerlo (TIMTOWTDI). Personalmente, creo que la solución Perl, enumerada aquí, es probablemente la solución más simple y flexible en Linux. Si tiene varias extensiones de archivo, simplemente especifique el número que desea mantener sin cambios. La solución BASH4 también es muy buena, pero debe estar dispuesto a escribir la extensión varias veces o, alternativamente, usar otra variable para almacenarla. Pero si necesita una portabilidad seria, le recomiendo la última solución en esta respuesta que usa octals. Algunos de los sabores de Linux también incluyen una herramienta llamada , cambie el nombre que también puede valer la pena visitar. Su uso variará de la distribución a la distribución, así que escriba man rename
para obtener más información.
SOLUCIONES:
Usando Perl:
# single extension
perl -e 's/\.[^\.]*$/rename $_, uc($`) . $&/e for @ARGV' *.txt
# multiple extensions
perl -e 's/(?:\.[^\.]*){2}$/rename $_, uc($`) . $&/e for @ARGV' *.tar.gz
Usando BASH4:
# single extension
for i in *.txt; do j="${i%.txt}"; mv "$i" "${j^^}.txt"; done
# multiple extensions
for i in *.tar.gz; do j="${i%.tar.gz}"; mv "$i" "${j^^}.tar.gz"; done
# using a var to store the extension:
e='.tar.gz'; for i in *${e}; do j="${i%${e}}"; mv "$i" "${j^^}${e}"; done
Usando GNU awk:
for i in *.txt; do
mv "$i" $(echo "$i" | awk '{ sub(/.txt$/,""); print toupper($0) ".txt" }');
done
Usando GNU sed:
for i in *.txt; do
mv "$i" $(echo "$i" | sed -r -e 's/.*/\U&/' -e 's/\.TXT$/\u.txt/');
done
Usando BASH3.2:
for i in *.txt; do
stem="${i%.txt}";
for ((j=0; j<"${#stem}"; j++)); do
chr="${stem:$j:1}"
if [[ "$chr" == [a-z] ]]; then
chr=$(printf "%o" "'$chr")
chr=$((chr - 40))
chr=$(printf '\'"$chr")
fi
out+="$chr"
done
mv "$i" "$out.txt"
out=
done
1.He utilizado estos consejos para cambiar mis nombres de archivo divertidos con un bash one-liner: para mí en ./*.*; hacer mv "$ i" "$ (echo" $ i "| tr '[:? = &]' '[_]')"; hecho ; 2. Cruce la referencia de fyi para tratar incluso los caracteres unicode más extraños: http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile