Cómo limpiar las extensiones de files?

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

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

… aunque sé que no está del todo bien. 🙂 La sustitución no es correcta y no estoy seguro de cómo usar un command mv y un command sed con -exec en find .

¿Necesitaría un script bash para esto?

Aquí hay una forma de hacer esto en Bash:

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

He usado echo aquí, por lo que el command en sí no hace más que imprimir nombres de pares de files. Si esa list representa los cambios que desea realizar, puede cambiar el echo a algo como mv -i -- que luego moverá sus files (y le indicará antes de sobrescribir).

Breve explicacion:

El for itera a través de cada file emparejado por * . Luego, determinamos si la extensión ya está en minúscula, si es que avanzamos, si no es así, procedemos a moverla (o repetirla, según sea el caso). Esto usa las operaciones de string de Bash construidas sobre las cuales puedes leer aquí: http://tldp.org/LDP/abs/html/string-manipulation.html

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 

Podría usar el command de cambio de nombre para esos. Por ejemplo, para cambiar el caso de las extensiones de nombre de file de superior a inferior, intente esto:

 rename .JPG .jpg *.JPG 

Aquí hay algunos types de tutoriales sobre cómo pasó de un guión de bash desorderado a este simple command para exactamente su caso de uso.

Otro command elegante para hacer esto es pax . Si está utilizando ZSH para su shell, también puede usar zmove .

Utilice perl-rename , razor suiza de renombrado de files con expresiones regulares (en ubuntu, esto se incluye con el package perl como prename):

 # Replace prename as appropriate (ie 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 para ver lo que realmente hará.

Necesita una secuencia de commands, porque las "extensiones" en Linux son solo partes de la cadena del nombre del file. Tienes que hacer algo de manipulación de cadenas en el script para get el nuevo nombre.

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

La cita doble es importante si tiene nombres de files con espacios en blanco. Pensé que algunas de las citas dobles eran un poco inobvibles.

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