기본적으로 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
, -o
and , !
not -and
, -or
및 입니다 -not
.
파일 내용 내에서 문자열을 찾으려면 find
with grep
(예를 들어)를 사용해야 합니다.