特定の値を含むXMLファイルの検索

特定の値を含むXMLファイルの検索

約10K個のXMLファイルを含むフォルダがあります。それぞれは次のとおりです。

...
<object>
<name>Cat</name>
</object>
<object>
<name>Cow</name>
</object>
...

人、猫、犬、牛などname...猫や犬を含む唯一のxmlファイルを選択したいです。どうすればいいですか?

答え1

あなたのようなXML文書のノードから全体または値を取得するには、Cat次のように使用できます。Dognamexmlstarlet

xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml

Catこれにより、sumという単語がドキュメントにそのノードの子ノードの値として存在する場合、出力としてsumという単語が生成されます。そのノードの子以外のノードがある場合、または一部のノードに属性などがある場合は、これを正しく実行することは困難です。Dogobjectnamegrepnameobjectname

残念ながら、XML入力ファイルに何も見つからない場合は、ゼロ以外の終了状態で終了しないため、出力があることを確認するために末尾にを追加する必要がありますxmlstarlet(これは次のステップで使用されます)。grep:

xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml | grep '.'

その後、すべての10,000個のファイルで実行できます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

まず、現在のディレクトリまたはその下で名前付きファイルを探します.xml。これらのファイルごとにxmlstarlet文字列を実行して、正しいXMLノードから合計を抽出し、見つかった項目があるかどうかをCat確認します。そのオプションを使用して実行すると、ユーティリティは静かになりますが、一致するものがあるかどうかに応じて適切な終了状態で終了します。Doggrepxmlstarletgrep-q

grep何も見つかると、findデータを含むファイルのパス名を印刷します。

答え2

次のコードは以下に基づいています。GNU grep

あなたが言ったように、すべてのファイルがこのため、grepを使うだけです。

猫や犬にはお使いください。

grep -l '<name>\(Cat\|Dog\)</name>' *

猫と犬の両方がある場合は、以下を使用してください。

grep -l '<name>Cat</name>' * | xargs grep -l '<name>Dog</name>'

大文字と小文字を区別せずに検索するには、-igrepにオプションを追加してください。

-l- このオプションは一致するファイル名のみを印刷します。

一般正規表現、文字を使用し(てエスケープが必要|なので)エスケープしました。

答え3

お持ちの場合たくさんBeagle、Tracker、glickなどのインデクサーツールをお試しください。

例:

$ glimpseindex -H .  MyDir
$ glimpse -l  -H .  'cat;dog'     

CADと犬を含むファイルをインポートする

関連情報