Aqui está uma solução com find que também exibirá os nomes dos arquivos contendo uma correspondência:
find . -name "*.xml" -exec grep '<dbname>' {} \; \
-exec echo -e {}"\n" \; \
| sed 's/<dbname>\(.*\)<\/dbname>//g'
Explicação
-
find . -name "*.xml"localiza todos os arquivos xml recursivamente a partir do diretório atual -
-exec grep '<dbname>' {} \;em cada pesquisa de arquivo para o padrão<dbname> -
-exec echo -e {}"\n" \;echo filename + nova linha (-eopção faz o echo interpretar\n) -
| sed 's/<dbname>\(.*\)<\/dbname>//g'saída de canal parasedpara imprimir apenas o campo contido entre as tags<dbname></dbname>.
NOTA 1: você pode formatar a saída em echo -e ... para ter resultados para cada arquivo claramente definidos, por exemplo, adicionando novas linhas ou linhas de sublinhado, o que for mais adequado à sua necessidade.
NOTA2: o caminho para cada arquivo será dado em relação a . (por exemplo, ./subfolder1/file.xml ). Se você quiser um caminho absoluto, vá para find $PWD -name ... .