特定のパスのXMLファイルを見つける

特定のパスのXMLファイルを見つける

私はXMLファイルを処理していますが、各ファイルの長さは数十行です。文字通り、何百ものファイルがディレクトリ構造に分散されています。はい、マゼントです。

この要素を含むファイルを見つける必要があります<foo><bar><boom><bang>。タグ<boom><bang>は他のタグの下で定義できます。フルパスを検索する必要があります。ただ閉じるタグやタグではありません。各タグの間には数十行があり、その間には異なるタグがあります。

<foo>
  <hello_world>
... 50 lines ....
  </hello_world>
  <bar>
    <giraffe>
... 50 lines ....
    </giraffe>
    <boom>
      <bang>Vital information here</bang>
    </boom>
  </bar>
</foo>

定義されたファイルを検索するためのエレガントな* nixメソッドは何ですか<foo><bar><boom><bang>私は現在、最新のDebian派生ディストリビューションを使用しています。

説得力から遠い現在の解決策は次のとおりです。

$ grep -rA 100 foo * | grep -A 100 bar | grep -A 100 boom | grep bang | grep -E 'foo|bar|boom|bang'

答え1

パスが存在するかどうかをxmlstarlet試した後、ファイル名を出力できます。selif

find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +

答え2

xqXMLパーサーツールの使用yqインストールパッケージそして、xq出力に基づく終了ステータスが0の場合にのみファイル名を印刷します。

find -type f -name '*.xml' -exec sh -c '
    xq -e '.foo.bar.boom.bang' "$1" >/dev/null
' _ {} \; -print

-e は出力に従って終了ステータスコードを設定します。


man jqこのオプションの詳細については、次を参照してください。

-e / --exit-status:
最後の出力値が false または null でない場合、jq の終了状態を 0 に設定し、有効な出力が生成されない場合は 1 に設定します。その結果、4に設定されました。通常、jqは使用上の問題やシステムエラーがある場合は2で終了し、jqプログラムコンパイルエラーがある場合は3で終了し、jqプログラムが実行されている場合は0で終了します。

関連情報