約10K個のXMLファイルを含むフォルダがあります。それぞれは次のとおりです。
...
<object>
<name>Cat</name>
</object>
<object>
<name>Cow</name>
</object>
...
人、猫、犬、牛などname
...猫や犬を含む唯一のxmlファイルを選択したいです。どうすればいいですか?
答え1
あなたのようなXML文書のノードから全体または値を取得するには、Cat
次のように使用できます。Dog
name
xmlstarlet
xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml
Cat
これにより、sumという単語がドキュメントにそのノードの子ノードの値として存在する場合、出力としてsumという単語が生成されます。そのノードの子以外のノードがある場合、または一部のノードに属性などがある場合は、これを正しく実行することは困難です。Dog
object
name
grep
name
object
name
残念ながら、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
確認します。そのオプションを使用して実行すると、ユーティリティは静かになりますが、一致するものがあるかどうかに応じて適切な終了状態で終了します。Dog
grep
xmlstarlet
grep
-q
grep
何も見つかると、find
データを含むファイルのパス名を印刷します。
答え2
次のコードは以下に基づいています。GNU grep
あなたが言ったように、すべてのファイルがこのため、grepを使うだけです。
猫や犬にはお使いください。
grep -l '<name>\(Cat\|Dog\)</name>' *
猫と犬の両方がある場合は、以下を使用してください。
grep -l '<name>Cat</name>' * | xargs grep -l '<name>Dog</name>'
大文字と小文字を区別せずに検索するには、-i
grepにオプションを追加してください。
-l
- このオプションは一致するファイル名のみを印刷します。
一般正規表現、文字を使用し(
てエスケープが必要|
なので)
エスケープしました。
答え3
お持ちの場合たくさんBeagle、Tracker、glickなどのインデクサーツールをお試しください。
例:
$ glimpseindex -H . MyDir
$ glimpse -l -H . 'cat;dog'
CADと犬を含むファイルをインポートする