E, no entanto, não é muito difícil:
for i in "$(find . -type f -name '* *' -print)"; do cp "$i" $(echo $i | sed 's/ /_/g'); done
Isso pressupõe que os nomes dos seus diretórios não contêm . Se eles fizerem isso, o seguinte script funcionará:
#!/bin/bash
TGT=/path/to/targt/directory
LIST="$(find $TGT -type f -name '* *' -print)"
for i in $LIST; do
dirpath=${i%/*}
base=base=${i##*/}
newbase=$(echo "base" | sed 's/ /_/g')
cp "$i" $dirpath/$newbase
done
Se os nomes dos seus diretórios contiverem espaços, e você quiser aqueles dulicados, você terá que especificar melhor o que deseja duplicar: os arquivos originais e os novos, somente os novos, possíveis outros arquivos sem espaços ...