약 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 입력 파일에서 아무 것도 발견되지 않으면 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
하고 찾은 항목이 있는지 확인합니다. 해당 옵션을 사용하여 실행하면 유틸리티가 조용해지지만 일치하는 항목이 있는지 여부에 따라 적절한 종료 상태로 종료됩니다.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와 개가 포함된 파일 가져오기