디렉터리 이름을 매개변수로 제공하는 스크립트가 필요합니다. 스크립트는 모든 하위 디렉터리 .php
파일을 확인하고 "Hello"라는 문자열이 포함된 파일이 있으면 디렉터리를 포함하는 일치하는 파일을 나열합니다.
답변1
다음 명령을 사용하면 이 문자열이 포함된 모든 파일을 찾을 수 있습니다.
$ grep -lr Hello directoryname
grep
검색 문자열(이름은 g/re/p
편집기에서 사용하는 ed
"g" 전역 검색 "re" 정규 표현식 , "p"는 일치하는 행을 인쇄하는 데 사용됨).
"일치하는 파일만 나열" 을 의미하며 -l
일반적으로 일치하는 줄이 있는 파일 이름을 표시합니다(그런데 파일이 하나만 제공되면 해당 이름은 일반적으로 숨겨집니다).
-r
"재귀 검색"을 의미합니다 .
이제 파일 이름이 있으므로 일치하는 파일이 포함된 디렉터리의 이름만 필요하므로 파일 이름을 제거해야 합니다. sed
(스트림 편집기)를 사용하여 파이프를 추가하면 됩니다 .
$ grep -lr Hello directoryname | sed 's:/[^/]*$::'
s
for 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
수행합니다 .-exec
grep -q
{}
-m1
*.php
'Hello'
-print