Les deux méthodes devraient marcher mais j'ai pas détaillé leur fonctionnement, à tester avec prudence.
#!/bin/sh for a in * ;do b=$(echo $a | sed -e 's/[[:blank:]]/_/g'); if [ -e "$b" ];then echo "">/dev/null; else mv "$a" "$b"; fi done
Trouvé sur Debian, ayant l'intérêt d'être récursif.
#!/bin/sh find "$1" -depth | while read chemin; do prefixe=`echo "$chemin" | sed 's/[^/]*$//'` suffixe=`echo "$chemin" | sed -e 's/.*\///' -e 's/ /_/g'` mv -T "$chemin" "$prefixe$suffixe" done