grep -ril
그래서 폴더로 만들고 싶습니다 . 일치하는 상위 폴더만 반환하고 싶습니다.
표시하려면:
/tmp/: grep -ril "hello"
반품:
tmp1/banan/file
tmp1/banan2/file
tmp2/ape/file
tmp2/ape2/file
예상되는 결과:
tmp1
tmp2
답변1
첫 번째 수준 디렉터리만 인쇄하려는 경우 해당 디렉터리에서 첫 번째 일치 항목을 찾은 후 즉시 종료하는 것이 더 효율적입니다. 이것을 달성하기 위해 이것을 사용할 수 있습니다 -q
. 성공하면 일치 항목을 반환하고, 그렇지 않으면 실패하며, -r
이것과 결합하면 일치 항목이 발견되자마자 종료됩니다.
for d in */; do grep -qri "hello" -- "$d" && printf "%s\n" "$d"; done
--
옵션의 끝을 나타내는 데 사용되므로 다음은 지정된 디렉터리를 보호 -something
하고 옵션으로 해석될 수 있는 파일 인수입니다.
for
위 내용을 로 시작하는 디렉토리와 일치시키 려면 .
설정을 고려하십시오 shopt -s dotglob
.이것.
/
출력에서 후행을 제거 해야 하는 경우 bash 인수 확장을 사용하고 "$d"
대신 print 를 사용할 수 있습니다 "${d%/}"
.
답변2
디렉터리는 콘텐츠 패턴과 일치하지 않습니다. 당신이 묻는 것은 패턴과 일치하는 파일의 디렉토리를 얻는 방법입니다.
첫 번째 구성 요소 뒤의 경로를 제거하고 결과가 지정한 순서대로 고유한 값으로 표시되는지 확인하세요.
grep -ril "hello" | sed 's!/.*$!!' | sort -u
결과 순서를 변경하지 않으려면 다음 sort
으로 바꾸십시오.awk '!h[$0]++'