grep은 디렉토리 경로만 반환합니다.

grep은 디렉토리 경로만 반환합니다.

저는 grep을 사용하여 큰 디렉터리를 검색하고 있는데 문제는 정규식을 만족하는 디렉터리만 필요하다는 것입니다. 파일 이름은 필요하지 않습니다.

내가 사용하는 grep 명령은 다음과 같습니다.

grep -Erin "RegEx" * > outputfile.txt

답변1

@RalfFriedl에 따르면 정규식과 일치하는 파일의 디렉터리 이름만 원하는 경우 dirname을 사용할 수 있습니다. 디렉터리에 여러 파일이 있는 경우 sort를 사용하여 출력을 정렬된 고유 목록으로 축소할 수 있습니다. 이와 같이:

dirname $(grep -Eril "RegEx" *) | sort -u

답변2

Grep에는 이 옵션이 없습니다.

파일 이름이 필요하지 않은 경우 왜 -n줄 번호 옵션을 사용합니까?

일치하는 파일 이름을 나열하는 옵션이 있습니다.

-l, --files-with-matches는
일반 출력을 억제합니다. 대신 인쇄하면 일반적으로 각 입력 파일의 이름이 인쇄됩니다. 검색은 첫 번째 일치에서 중지됩니다.

sed파일 이름의 마지막 부분을 제거하고 디렉터리 부분만 유지할 수 있습니다 . 각 디렉터리를 한 번만 나열하려면 출력을 실행하면 됩니다 sort -u.

답변3

이 명령을 사용해 보십시오 find.

find . -type d -regextype posix-extended -regex 'RegEx'

경로 이름과 일치하도록 posix 확장을 사용하여 현재 디렉터리에서 디렉터리 유형의 콘텐츠를 찾습니다(grep -E와 동일).

답변4

# usage: dgrep regex dir
dgrep(){
        find "$2" -type d -print0 | xargs -0 sh -c '
                rex=$1; shift
                for d; do grep -sq "$rex" "$d"/* "$d"/.[!.]* && echo "$d"; done
        ' sh "$1"
}

grep -rl+ 솔루션과 달리 sed이는 첫 번째 일치 항목이 발견될 때까지 디렉터리의 파일만 검색합니다. 데이터에 따라 작업 속도가 크게 향상될 수 있습니다.

-sq뒤에 grep 옵션을 자유롭게 추가하십시오. 명령줄에서 스크립트를 전달할 수 있지만 이로 인해 모든 것이 복잡해지고 이점이 거의 없습니다.

관련 정보