Puede pasar explícitamente una cadena vacía como argumento.
rename .old '' *.old
Y con subcarpetas, find . -type d -exec rename .old '' {}/*.old \; . {} es el sustituto de la entrada encontrada con find y \; termina la lista de argumentos para el comando dado después de -exec .
rename es ligeramente peligroso, ya que según su página de manual:
renombrar cambiará el nombre de los archivos especificados reemplazando el primero aparición de...
Felizmente hará lo incorrecto con nombres de archivo como c.txt.parser.y .
Aquí hay una solución usando find y bash :
find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done
Tenga en cuenta que esto fallará si un nombre de archivo contiene una nueva línea (raro, pero no imposible).
Si tiene GNU find, esta es una solución más sólida:
find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done
Yo uso esto:
find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \;
La versión Perl de cambiar el nombre puede eliminar una extensión de la siguiente manera:
rename 's/\.txt$//' *.txt
Esto podría combinarse con buscar para hacer también subcarpetas.