제목에 특정 텍스트가 포함된 폴더에서 파일을 선택하는 방법은 무엇입니까?

제목에 특정 텍스트가 포함된 폴더에서 파일을 선택하는 방법은 무엇입니까?

사용 사례: 큰 RDF+XML 파일로 가득 찬 폴더가 있고 서로 다른 네임스페이스를 따른다고 가정해 보겠습니다. 우리는 주어진 네임스페이스(예: )를 따르는 파일을 찾고 싶습니다 xmlns:crm="http://www.cidoc-crm.org/cidoc-crm#".

네임스페이스는 항상 XML 파일의 처음 몇 줄에 정의되므로 위에서 아래로 파일을 검색하는 데 시간이 많이 걸립니다.

제목에 특정 텍스트가 포함된 거대한 폴더에서 파일을 선택하는 방법은 무엇입니까?

답변1

대답은 다음과 같습니다.

 awk '/hi/ { if (FNR >= 5) { nextfile }; print FNR, FILENAME }' *

정규식을 사용하여 문자열 변경 사항을 일치시킵니다 /hi/. 보려는 헤더의 마지막 줄 번호 5로 변경하세요 .

답변2

awk지원하는 경우 처음 5줄만 확인하세요 nextfile.

TEXT='xmlns:crm="http://www.cidoc-crm.org/cidoc-crm#"' \
  find . -type f -exec awk '
     index($0, ENVIRON["TEXT"]) {print FILENAME; nextfile}
     FNR == 5 {nextfile}' {} +

( awk지원하지 않으면 nextfile자동으로 무시되고 파일이 완전히 읽혀집니다.)

또는 다음을 사용할 수 있습니다 perl.

TEXT='xmlns:crm="http://www.cidoc-crm.org/cidoc-crm#"' \
  find . -type f -exec perl -Tne '
     if (index($_, $ENV{"TEXT"}) >= 0) {print "$ARGV\n"; close ARGV}
     elsif ($. == 5) {close ARGV}' {} +

답변3

모든 파일에 네임스페이스 선언이 있는 경우 GNU/FreeBSD/OSX grep 또는 -m해당 옵션이 포함된 구현을 사용하여 네임스페이스 선언을 찾고 발견되는 즉시 종료한 다음 결과를 두 번째 grep으로 파이프하여 원하는 네임스페이스를 얻을 수 있습니다. 관심이 있어요.

grep -m xmlns: *.xml  |grep 'xmlns:crm="http://www.cidoc-crm.org/cidoc-crm#"'

일부 파일에 인식된 네임스페이스 선언이나 "종료"를 나타내는 다른 패턴이 없으면 sed 또는 awk를 사용하여 줄 번호를 기반으로 종료 조건을 지정합니다. sed를 사용하면 파일당 줄 수를 계산할 방법이 없으므로 각 파일에 대해 sed를 호출해야 합니다.

for x in *.xml; do
  if [ -n "$(sed -n -e 's/.*xmlns:crm="http:\/\/www.cidoc-crm.org\/cidoc-crm#".*/1/' -e '/xmlns:/q' -e '5q')" ]; then
    printf '%s\n' "$x"
  fi
done

바라보다Stefan Chazeras의 답변어크 솔루션.

텍스트 처리 도구를 기반으로 하는 모든 접근 방식은본질적으로 깨지기 쉬운. 예를 들어 주석 처리된 네임스페이스 선언을 선택합니다. 결과를 수동으로 보고 있거나 모든 파일이 "길들인" 구조(주석 없음, 검색 중인 것과 유사한 페이로드 텍스트 없음 등)를 가지고 있다는 것을 알고 있지 않는 한, 대신 적절한 XML 파서를 사용해야 합니다. 그렇게 천천히.

관련 정보