Se você precisar renomear arquivos em subdiretórios, e seu find suportar o predicado -execdir , você poderá fazer
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Obrigado a @glenn jackman por sugerir a opção -depth para find e me fazer pensar.
Note que em alguns sistemas (incluindo os GNU / Linux), find pode não encontrar arquivos cujo nome contenha espaços e também sequências de bytes que não formam caracteres válidos (típico de arquivos de mídia com nomes com Caracteres ASCII codificados em um conjunto de caracteres diferente do locale). Definir a localidade como C (como em LC_ALL=C find... ) resolveria o problema.