특정 값이 포함된 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 입력 파일에서 아무 것도 발견되지 않으면 0이 아닌 종료 상태로 종료되지 않으므로 출력이 있는지 확인하기 위해 끝에 를 추가 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와 개가 포함된 파일 가져오기

관련 정보