Dar a todos los archivos una extensión .jpg

8

Tengo un directorio y algunas de las extensiones de los archivos están en mayúsculas (.JPG) en lugar de minúsculas.

Quiero asegurarme de que cada archivo tenga .jpg como extensión. ¿Cómo haría esto desde un indicador de shell?

Mark Flint
fuente
Es una pena que Linux no tenga AppleScript.
gadgetmo
2
Es tan genial que Linux no tiene AppleScript.
matemáticas

Respuestas:

15

Uso de la expansión de parámetros de Shell :

for f in *.JPG; do
    mv "${f}" "${f%%.JPG}.jpg"
done

Los "personajes se ocuparán de los nombres de archivo que contienen espacios, como suelen hacer las fotografías.

Johnsyweb
fuente
55
+1 Esta solución funciona incluso si tiene espacios en el nombre del archivo, pero quiere decir "$ f" en lugar de "f".
Adam Zalcman
Shell Parameter Expansion es un poco críptico, uno podría usar basename en su lugar: para f en * .JPG; do mv "$ f" "` nombre base $ f .JPG`.jpg "; hecho
matemática
@math: prefiero mi versión, ya que funciona con nombres de archivo que contienen espacios en blanco y también funcionará con /path/to/*.JPG. Puede enviar su propia respuesta, por supuesto :)
Johnsyweb
Por supuesto, basename eliminará los directorios principales, pero funcionará con espacios dentro de los nombres de archivo. (No creo que esto valga una respuesta;) así que lo publiqué como un comentario)
matemáticas
10

Si puede usar herramientas externas (no solo bash), ¡verifique el renamecomando!

rename .JPG .jpg *

El renamees parte de util-linux.

uzsolt
fuente
cambiar el nombre es ... problemático. Se incluye una versión de cambio de nombre que perlacepta diferentes argumentos para hacer lo mismo.
cha0site
¿Podrías explicar un poco más? ¿Qué versión por cierto?
matemáticas
3

Si tiene espacios en los nombres de archivo:

for f in *.JPG; do [[ -f "${f}" ]] && mv "${f}" "${f/%JPG/jpg}"; done
cha0site
fuente
2

Sugeriría echar un vistazo al mmvcomando. Es adecuado exactamente para este tipo de tareas. En su escenario sería:

#> mmv "*.JPG" "#1.jpg"

La página de manual está llena de ejemplos, por lo que no lleva tiempo acostumbrarse a ella.

En los sistemas Debian se puede instalar con:

#> aptitude install mmv
Alessandro Dotti Contra
fuente
0

Si no tiene espacios en los nombres de archivo:

for f in *.JPG; do mv $f `echo $f | sed 's/JPG$/jpg/'`; done
Karoly Horvath
fuente
1
Sería bastante fácil hacer que esto funcione para archivos con espacios en el nombre: simplemente agregue comillas dobles alrededor de ambos argumentos mv.
Adam Zalcman
No tengo espacios ¿Qué agrego para que esto suceda en el directorio ACTUAL? En este momento recibo el error - mv: no se puede stat `* .JPG ': No existe tal archivo o directorio
Mark Flint
1
no tienes ningún JPG allí.
Karoly Horvath