¿Cómo limpiar las extensiones de archivo?

9

Tengo un directorio con archivos .MP3 que me gustaría cambiar las extensiones a .mp3. ¿Cuál es la forma más fácil de hacer esto? Estoy pensando en algo como:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

... aunque sé que eso no está del todo bien. :) La sustitución no es correcta y no estoy seguro de cómo usar a mvy un sedcomando con -execin find.

¿Necesitaría un script bash para esto?

Caleb
fuente

Respuestas:

12

Aquí hay una forma de hacer esto en Bash:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Lo he usado echoaquí, por lo que el comando en sí no hace nada más que imprimir pares de nombres de archivos. Si esa lista representa los cambios que desea hacer, puede cambiar echoa algo como mv -i --lo que luego moverá sus archivos (y le indicará antes de sobrescribir).

Breve explicacion:

El foritera a través de cada archivo emparejado por *. Luego, determinamos si la extensión ya está en minúscula, si es así, seguimos adelante, si no es así, procedemos a moverla (o repetirla, según sea el caso). Utiliza las operaciones de cadena integradas de Bash que puede leer aquí: http://tldp.org/LDP/abs/html/string-manipulation.html

Steven D
fuente
¡Gracias por su respuesta y por señalarme un enlace sobre manipulación de cadenas de bash!
7

En zsh:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

Para cuidar .Mp3o .mP3archivar también:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'
Gilles 'SO- deja de ser malvado'
fuente
6

Podrías usar el comando rename (cuidado, hay dos implementaciones principales con diferentes API) para esos. Por ejemplo, para cambiar el caso de las extensiones de nombre de archivo de arriba a abajo, intente esto:

  • con renamefrom util-linux(a veces llamado rename.ul), suponiendo que .JPGocurra solo una vez en los nombres de archivo

    rename -- .JPG .jpg *.JPG
  • con renamefrom perl(a veces llamado prename; se han publicado varias variantes):

    rename 's/\.JPG$/.jpg/' ./*.JPG

Aquí hay algunos tutoriales sobre cómo pasó de un script de bash desordenado a este simple comando para su caso de uso.

Otro comando elegante para hacer esto es pax. Si está utilizando ZSH para su shell, también podría usarlo zmv.

Caleb
fuente
¡súper! exactamente lo que necesitaba
JoshP
Recibo un error syntax error at (user-supplied code), near "."cuando ejecuto este comando.
Ryan Gates
3

Utilice perl-rename , navaja suiza de cambio de nombre de archivo con expresiones regulares (en ubuntu, esto se incluye con el paquete perl como nombre previo):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Si eres del tipo cuidadoso, usa las opciones -n y -v para cambiar el nombre de Perl y ver qué hará realmente.

Kjetil Jorgensen
fuente
Gracias por tu respuesta. No tengo perlrename en el servidor, ¡pero voy a jugar con él más tarde hoy!
0

Necesita un script, porque las "extensiones" en Linux son en realidad solo partes de la cadena del nombre del archivo. Tienes que hacer alguna manipulación de cadenas en el script para obtener el nuevo nombre.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

Las comillas dobles son importantes si tiene nombres de archivo con espacios en blanco. Pensé que algunas de las comillas dobles eran un poco inocuas.

Bruce Ediger
fuente
1
No hay nada malo por decir con su script, pero definitivamente no necesita un script para esto. Probablemente hay una docena de formas de hacerlo en una línea en la mayoría de los shells, y muchas utilidades para facilitarlo también.
Caleb
0

En bash:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done
Maxime R.
fuente
0

primero haga una copia de seguridad de sus archivos! puedes usar una línea de Python:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

EDITAR:

Aquí hay una explicación detallada de cómo funciona realmente el one-liner. Usando python -cestamos pasando un comando al intérprete de Python. Después de importar las bibliotecas ospara la renamefunción y globpara la lista de archivos, necesitamos iterar a través de la lista de archivos en el directorio dado, que llamé PATH_TO_YOUR_DIRECTORY, por ejemplo, algo así como ./*para todo en el directorio actual.

Desafortunadamente, en la sintaxis de una línea, los forbucles no funcionan después de la importnotación, por lo que debemos usar la notación de corchetes. Es decir, por cada archivo o nombre de directorio que globnos proporciona desde la ruta dada en forma de cadena, reemplazamos * .MP3 por * .mp3.

Como OP no mencionó la búsqueda recursiva, no la incluí en primer lugar.

xaratustra
fuente