Agregar extensión de file a files que no tienen extensión

Tengo cientos de files en varios subdirectorys diferentes. Algunos de ellos tienen la extensión de file correcta, pero algunos no. Quiero cambiar el nombre de todos los files que no tienen una extensión de file y anexar una extensión .mp4 a su nombre de file. Los otros files no deberían tocarse. ¿Cómo puedo automatizar esta operación de cambio de nombre usando Bash? ¿O necesito un lenguaje de scripting real como Perl o Python para esto?

Algo como esto:

 find . -type f ! -name "*.*" -exec mv {} {}.mp4 \; 

Prueba esto:

 find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} + 

Esto busca todos los files en el directory actual y sus subcarpetas que no terminan con .mp4 y los renombra para agregar la extensión

Asume el command de rename basado en perl , la opción -n es para mostrar cómo se cambiarán los rename los files. Una vez que esté de acuerdo con esto, elimine la opción y vuelva a ejecutar el command

Ejemplo:

 $ find -type f ./rand_numbers.txt ./tst ./abc/123 ./abc/zyx.txt $ find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} + rename(./rand_numbers.txt, ./rand_numbers.txt.mp4) rename(./tst, ./tst.mp4) rename(./abc/123, ./abc/123.mp4) rename(./abc/zyx.txt, ./abc/zyx.txt.mp4) 

Si define el file que no tiene extensión para significar los nombres de file sin . en su nombre, use:

 $ find -type f -not -name '*.*' -exec rename -n 's/$/.mp4/' {} + rename(./tst, ./tst.mp4) rename(./abc/123, ./abc/123.mp4) 

testing esto:

 #!/bin/bash # Warning: globstar excludes hidden directories. # Turn on recursive globbing (in this script) or exit if the option is not supported: shopt -s globstar || exit for f in **; do if [ -f "$f" ]; then case "${f##*/}" in *.*) continue ;; esac mv "$f" "$f".mp4; fi done