Para coisas potencialmente complicadas e potencialmente perigosas como essa, eu gosto de gerar um script para fazer o que eu quero.
$ find foo_project -print > /tmp/list
$ vi /tmp/list
:%s/.*/'&'/ # quote all filenames just to be safe
:%s/.*/mv & &/ # generate mv commands
:%s/' '/'\r'/ # break them for the next step
:v/^mv /s/foo/bar/g # modify the second arguments
:g/^mv /j # re-join the lines
Agora, analise o script que você acabou de criar para ter certeza de que ele fará o que deseja:
mv 'foo_project/my_app/old_foo/start_foo.sh' 'bar_project/my_app/old_bar/start_bar.sh'
...
Se você gosta:
:wq
$ sh /tmp/list
Esta é uma técnica geral que uso o tempo todo. A maneira exata de editar o script depende do que você deseja realizar. Não é uma frase sexy, mas é seguro.
Agora, se isso é algo que você deseja fazer regularmente, e não uma única vez, essa técnica provavelmente não é o que você deseja. Mas para uma operação one-shot onde você está meio que se sentindo bem, isso funciona muito bem.
Agora, se você quiser uma solução reutilizável, é hora de escrever um script:
#!/bin/sh
find foo_project -print | while read filename; do
newname='echo $filename | sed -e 's/foo/bar/g''
echo "renaming $filename => $newname"
mv "$filename" "$newname"
done