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