Para obter todos os valores de Cat
ou Dog
do nó name
em um documento XML como o seu, use xmlstarlet
da seguinte forma:
xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml
Isso geraria as palavras Cat
e Dog
como saída se elas existirem no documento como os valores de um nó-filho object
do name
. Essa operação seria difícil de acertar com grep
caso haja outros name
nós que não sejam nós filhos para object
nós, ou se alguns name
nós tiverem atributos etc.
Infelizmente, xmlstarlet
não sai com um status de saída diferente de zero se não encontrar nada no arquivo de entrada XML, por isso precisamos adicionar um grep
no final para verificar se obteve alguma saída (isso será usado na próxima etapa):
xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml | grep '.'
Em seguida, podemos executar isso em todos os arquivos 10k, embora find
:
find . -type f -name '*.xml' -exec sh -c '
xmlstarlet sel -t -v "//object/name[text() = \"Cat\" or text() = \"Dog\"]" "$1" |
grep -q "."' sh {} ';' -print
Isso primeiro encontrará todos os arquivos regulares dentro ou abaixo do diretório atual cujos nomes terminam com .xml
. Para cada arquivo, xmlstarlet
é executado para extrair as sequências Cat
e Dog
dos nós XML corretos, e grep
é usado para verificar se xmlstarlet
encontrou alguma coisa. A execução de grep
com sua opção -q
torna o utilitário silencioso, mas sairá com o status de saída apropriado, dependendo se ele correspondeu a algo ou não.
Se grep
encontrou alguma coisa, find
imprime o nome do caminho do arquivo que continha os dados.