¿Cómo cambio el nombre de todos los archivos a minúsculas?

123

Tengo, por ejemplo, TREE.wav, ONE.WAV. Quiero cambiarle el nombre a tree.wav, one.wav. ¿Cómo cambio el nombre de todos los archivos a minúsculas?

Voloda2
fuente
1
¿Se siente cómodo con una solución Terminal / shell? ¿O quieres que el código C / Objective-C logre eso?
La solución terminal estará bien.
Voloda2
3
Creo que esto debería reabrirse. el código de terminal también es código
Danield
1
Esta debería ser una pregunta válida en stackoverflow. Esto también es código.
adev

Respuestas:

371

Si se siente cómodo con la terminal:

  1. Abra Terminal.app, escriba cdy luego arrastre y suelte la carpeta que contiene los archivos a renombrar en la ventana.
  2. Para confirmar que está en el directorio correcto, escriba lsy presione enter.
  3. Pega este código y presiona enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Para confirmar que todos sus archivos están en minúsculas, escriba lsy presione Intro nuevamente.

(Gracias a @bavarious en Twitter por algunas correcciones, y gracias a John Whitley a continuación por hacer esto más seguro en sistemas de archivos que no distinguen entre mayúsculas y minúsculas).

wjl
fuente
9
Ten cuidado. Si tiene archivos con nombre foo.txty FOO.TXT, esto podría golpear a uno de ellos.
Keith Thompson
1
Con bash, puedes hacer:, mv "$f" "${f,,}"odeclare -l g=$f; mv "$f" "$g"
glenn jackman
2
Probé todos estos comandos, obtengo "mv: 'PPP.txt' y 'ppp.txt' son el mismo archivo" y no minúscula mi archivo ... ¿alguna idea? ¿Es porque está en el mismo directorio?
lorless
1
user2066039: Debe ser algo reciente en Mac, porque la mayoría de las respuestas anteriores a un año no lo tienen en cuenta. Logré la tarea usando una extensión intermedia como 'jpg1'. Entonces, JPG -> jpg1 -> jpg. Espero que ayude.
Joyce
14
Los usuarios de OS X deben cambiar el nombre de cada archivo a un nombre temporal primero debido al sistema de archivos que no distingue entre mayúsculas y minúsculas, por ejemplo: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley
10

La pregunta tal como se hizo es general y también importante, por lo que deseo proporcionar una respuesta más general:

Caso más simple (seguro la mayor parte del tiempo y en Mac OS X, pero sigue leyendo):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

También debe manejar espacios en los nombres de archivo (cualquier sistema operativo):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Debe manejar de manera segura nombres de archivo que difieren solo entre mayúsculas y minúsculas en un sistema de archivos que distingue entre mayúsculas y minúsculas y no sobrescribir el destino (por ejemplo, Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Nota sobre Mac OS X:

El sistema de archivos de Mac no distingue entre mayúsculas y minúsculas, conserva las mayúsculas y las minúsculas.

Sin embargo, no hay necesidad de crear archivos temporales, como se sugiere en la respuesta aceptada y los comentarios, porque en primer lugar no pueden existir dos nombres de archivo que difieren solo por caso, ref .

Para mostrar esto:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x
Alex Harvey
fuente
Sí, pero su ejemplo sugiere que puede poner nombres de archivo en minúsculas usando 'mv X x'. Así que solo lo comenté.
cpaludan
mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 root root 0 24 de junio 15:19 X # mv X x mv: 'X' y 'x' son iguales file # ls -la -rw-r - r-- 1 root root 0 24 de junio 15:19 X
cpaludan
Perdón por el formato de mierda. Así que no fue amable conmigo allí.
cpaludan
1
Y mi error, estaba en un ssh en mi frambuesa en una unidad compartida (formateada con hfsplus), ahí no funciona. Pero localmente en mi mac lo hace.
cpaludan
para yo en *; do j = $ (tr '[: superior:]' '[: inferior:]' <<< "$ i"); mv "$ i" "$ j"; trabajó para mí en catalina. Gracias.
Sinan Eldem
2

Una versión de concha de pescado:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
arsenio
fuente