grep -ril, 최상위 디렉토리를 한 번만 표시

grep -ril, 최상위 디렉토리를 한 번만 표시

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]++'

관련 정보