find . -type f -a \( -name "*.h" -o -name "*.C" -o -name "*.cc" -o -name "*.cpp" \) -a -exec sed -i -e 's/${2}/${3}/g' {} +
Deve funcionar.
Em seu primeiro roteiro, o problema é que, se não houver correspondência para, por exemplo, *.h
, o bash passará o literal *.h
para sed, que então achará que é um nome de arquivo, mas como esse arquivo não existe, ele falhará.
No segundo caso, com find(1)
, você estava tendo o shell procurando por nomes de arquivos correspondentes no diretório atual e, em seguida, passá-los para encontrar (1).