O shell pode fazer isso facilmente:
for file in *.doc *.mp3 *.wav *.txt
do
mv -- "$file" "${file// /_}"
done
Altere o *.doc
... glob para corresponder aos arquivos nos quais você está interessado em renomear.
Para renomear todos os arquivos no diretório atual que atualmente possuem espaços em seus nomes de arquivos:
for file in *' '*
do
mv -- "$file" "${file// /_}"
done
Você também pode considerar adicionar uma verificação "clobber":
for file in *' '*
do
if [ -e "${file// /_}" ]
then
echo Warning, skipping "$file" as the renamed version already exists
continue
fi
mv -- "$file" "${file// /_}"
done