특정 확장자를 가지고 있지만 특정 텍스트를 포함하지 않는 파일을 찾는 스크립트

특정 확장자를 가지고 있지만 특정 텍스트를 포함하지 않는 파일을 찾는 스크립트

기본적으로 find(또는 다른 방법)를 사용하여 *.p 또는 *.w로 끝나지만 sysvars.i 또는 preprocess.i를 포함하지 않는 모든 파일을 찾기 위해 재귀적으로 검색하는 스크립트를 작성하려고 합니다.

사용하기에 가장 적합한 명령을 찾으십니까?

답변1

find및 작업을 결합 grep하여 이를 수행 할 수 있습니다.

find /search/path/ -type f \( -name '*.p' -or -name '*.w' \) \
    -exec grep -L -e 'sysvars.i' -e 'preprocess.i' {} +

그것을 분석해 봅시다.

  • find /serch/path지정된 경로의 모든 파일을 반환합니다. 다음으로 나중에 다른 항목을 확인하는 시간을 절약하기 위해 가장 많은 일치 항목을 제거하는 항목부터 시작하여 범위를 좁혀야 합니다.
  • -type f파일만 반환됩니다. 파일 이름 패턴과 일치하는 디렉터리가 있는 경우 해당 디렉터리를 grep.
  • \( [expr1] -or [expr2] \)find가 expr1 또는 expr2와 일치하는 파일을 반환하도록 둘 중 하나 또는 일치 항목을 만듭니다. 하지만 둘 다 일치해야 할 이유는 없습니다. 괄호는 구분하는 데 도움이 됩니다.또는실제 나머지 일치 옵션으로 그룹화그리고필요하다.
  • -name '*.p'그리고 -name '*.w'분명히 이러한 이름 패턴과 일치하는 파일이 반환됩니다.
  • -exec command {} +지정된 명령과 인수가 실행되어 {}해당 비트를 명령의 나머지 부분과 일치하는 각 파일의 인수로 대체됩니다 find. 이 -exec함수는 xargs참조 및 파일 이름 문제를 잘 처리하므로 루프를 사용하거나 루프로 파이프하는 것보다 더 좋습니다.
  • grep지정된 파일에서 패턴을 검색하는 데 사용됩니다.
    • -L일치하지 않는 파일 이름 목록만 반환하는 데 사용됩니다.
    • -e 'PATTERN'일치시키지 않으려는 두 개의 검색 문자열을 나열하려면 두 번 지정하십시오.

답변2

테스트를 찾는 복잡한 부울 표현식을 구성할 수 있습니다.

find . \( -name '*.p' -or -name '*.w' \) -and \
  -not \( -name 'sysvars.i' -or -name 'preprocess.i' \)

Posix 호환 옵션 이름은 -a, -oand , !not -and, -or및 입니다 -not.

파일 내용 내에서 문자열을 찾으려면 findwith grep(예를 들어)를 사용해야 합니다.

관련 정보