Cambiar el nombre de los archivos por lotes a minúsculas

17

¿Hay alguna manera de cambiar el nombre de todos los archivos en un directorio a minúsculas | mayúsculas?

Estoy buscando un comando oneliner .

Me encantó TotalCommander's alt+f7, ahora necesito esa funcionalidad en la Terminal

Unamata Sanatarai
fuente

Respuestas:

20

Para cada archivo a_fileen el directorio actual, cambie el nombre a_filea minúsculas.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

Para mayúsculas, invierta los argumentos para [:lower:] [:upper:]

trenlace de referencia de comando

Actualizar

Para aún más control *puede ser reemplazado con ls.

Por ejemplo, en un directorio que contiene 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg y 3.jpg para filtrar solo archivos * .jpg, lsse pueden usar:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

El código anterior asignará a la a_filevariable todos los archivos con extensión .jpg.

-vOpción de actualización agregada al mvcomando según sds sugerido.

Stef K
fuente
44
es posible que desee pasar "-v" a mvpara que vea lo que se está haciendo; es posible que no desee pasar "-f" porque esto puede
bloquear
Esto no funciona para archivos con espacios en su nombre.
Tianxiang Xiong
Puede usar comillas alrededor del nombre del archivo.
Stef K
2
Lo sentimos, pero la parte sobre ls * jpg es una mala idea. mywiki.wooledge.org/ParsingLs Puede obtener el mismo resultado con * jpg junto con donde tenía * en primer lugar.
Tink
16

Hay una utilidad más elegante y general llamada prename.

Escrito por Larry Wall, viene con perllo más probable es que ya esté disponible en su sistema como /usr/bin/prename(si tiene alternativas de configuración también puede estar disponible como /usr/bin/renameenlace simbólico a través de / etc / alternativas a prename)

Al usarlo, puede cambiar el nombre de varios archivos en un comando al proporcionar cualquier expresión perl (incluidas, entre otras, la sustitución s///o la transcripción de caracteres tr///):

Ejemplos:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

Y así.

Otra cosa buena acerca de prename es que lo protege, en el caso de cambiar el nombre de un archivo a un nombre de archivo existente.

man prename para más detalles.

arielf
fuente
1

Utilizando find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

por find

  • Por supuesto después de -nameponer tu patrón.
  • -maxdepth 0: Solo el directorio actual.

por rename

  • -n, -nono: Sin acción: imprime los nombres de los archivos a renombrar, pero no cambies el nombre.
  • y/source/dest/: Transcribe los caracteres en el espacio del patrón que aparecen en la fuente al carácter correspondiente en el destino.
Pablo Bianchi
fuente