A maneira mais óbvia que eu acho que você é:
find -name "*foo*" -exec rename s/foo/bar/ {} \;
ou com xargs, se você tiver muitos arquivos para renomear:
find -name "*foo*" | xargs -I '{}' rename s/foo/bar/ '{}'
No entanto, o problema com isso é se você tem uma estrutura de diretório parecida com esta:
.
|-- fooDir
| |-- foo.txt
| '-- abc
'-- foo2
Ele falhará ao renomear foo.txt, porque ele primeiro renomeará fooDir em barDir e, em seguida, declarará que ele não encontra mais "fooDir / foo.txt"
Simplesmente re-executando o comando até que você não tenha nenhum erro, mas é desleixado. Outra maneira seria executar o comando em um loop, uma vez para cada nível de profundidade da árvore de diretórios, com as opções find
options -mindepth
e -maxdepth
definidas para excluir outros níveis, mas você precisa saber a profundidade do seu sistema de diretórios.
Não consigo pensar em uma maneira melhor.