"hello"가 포함된 파일의 하위 디렉터리를 확인하고 디렉터리 이름을 반환하는 스크립트

"hello"가 포함된 파일의 하위 디렉터리를 확인하고 디렉터리 이름을 반환하는 스크립트

디렉터리 이름을 매개변수로 제공하는 스크립트가 필요합니다. 스크립트는 모든 하위 디렉터리 .php파일을 확인하고 "Hello"라는 문자열이 포함된 파일이 있으면 디렉터리를 포함하는 일치하는 파일을 나열합니다.

답변1

다음 명령을 사용하면 이 문자열이 포함된 모든 파일을 찾을 수 있습니다.

$ grep -lr Hello directoryname

grep검색 문자열(이름은 g/re/p편집기에서 사용하는 ed"g" 전역 검색 "re" 정규 표현식 , "p"는 일치하는 행을 인쇄하는 데 사용됨).

"일치하는 파일만 나열" 을 의미하며 -l일반적으로 일치하는 줄이 있는 파일 이름을 표시합니다(그런데 파일이 하나만 제공되면 해당 이름은 일반적으로 숨겨집니다).

-r"재귀 검색"을 의미합니다 .

이제 파일 이름이 있으므로 일치하는 파일이 포함된 디렉터리의 이름만 필요하므로 파일 이름을 제거해야 합니다. sed(스트림 편집기)를 사용하여 파이프를 추가하면 됩니다 .

$ grep -lr Hello directoryname | sed 's:/[^/]*$::'

sfor substitute이고 그 뒤에 일치하는 패턴과 대체 텍스트가 옵니다 . [^/]"/를 제외한 모든 문자"를 의미합니다. *0개 이상의 이전 개체를 나타냅니다 . $"라인의 끝 부분과 일치"를 의미합니다 . 따라서 줄 끝에 있는 슬래시가 아닌 모든 문자는그리고앞의 슬래시(일치하는 패턴의 첫 번째 문자)는 빈 문자열로 대체됩니다(대체 텍스트가 비어 있기 때문입니다).

검색 중인 문자열이 포함된 파일이 여러 개 있는 경우 디렉터리가 여러 번 표시될 수 있습니다. 이 문제는 파이프라인을 다시 확장하여 해결할 수 있습니다.

$ grep -lr Hello directoryname | sed 's:/[^/]*$::' | uniq

uniq연속적으로 반복되는 행을 제거하고 고유한 행(따라서 이름)만 남깁니다.

답변2

find * -prune -type d -exec grep -qm1 'Hello' {}/*.php 2>/dev/null \; -print

현재 디렉토리에 있는 모든 요소( ) *에서 디렉토리( )를 선택하고 ( ) 해당 단어가 포함된 -type d파일 이 있고 해당 파일이 허용되는 경우 각 요소( )에 대해 확인( )을 -prune수행합니다 .-execgrep -q{}-m1*.php'Hello'-print

관련 정보