정규식을 기반으로 파일을 검색한 다음 해당 파일의 내용을 검색하려고 합니다. 예를 들어 다음과 같은 것이 있습니다.
#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>"
내가 겪고 있는 문제는 일부 경로에 공백이 있다는 것입니다 xargs
. 이는 인수(및 인수 ) 를 find
사용 하여 . 비슷한 것이 있나요 ?-print0
-0
xargs
grep
아니면 내가 완전히 잘못된 방향으로 가고 있는 걸까? 순진하게 말하면 find
나 에게는 이해 grep
가 되지만 xargs grep
동일한 결과를 생성하는 다른 방법에도 열려 있습니다.
답변1
어쩌면 비슷한 것을 사용할 수도 있습니다(gnu grep인 경우).
grep -r 'content pattern' --include==*.cpp
사람들은 grep
--include=GLOB 기본 이름이 GLOB와 일치하는 파일만 검색합니다(--exclude에 설명된 대로 와일드카드 일치 사용).
빈 구분 기호에 대한 옵션도 참조하세요.
-Z, --null 일반적으로 파일 이름 뒤에 오는 문자 대신 0바이트(ASCII NUL 문자)를 출력합니다. 예를 들어, grep -lZ는 일반적인 개행 대신 각 파일 이름 뒤에 0바이트를 출력합니다. 이 옵션을 사용하면 파일 이름에 개행과 같은 특이한 문자가 포함된 경우에도 출력이 명확해집니다. 이 옵션은 find -print0, perl -0, sort -z 및 xargs -0과 같은 명령과 함께 사용하여 임의의 파일 이름, 개행 문자가 포함된 파일 이름도 처리할 수 있습니다.
-z, --null-data 입력을 줄 집합으로 처리하며, 각 줄은 개행 문자 대신 0바이트(ASCII NUL 문자)로 끝납니다. -Z 또는 --null 옵션과 마찬가지로 이 옵션은 sort -z와 같은 명령과 함께 사용하여 임의의 파일 이름을 처리할 수 있습니다.
답변2
많은 어려움을 겪어야 한다면 어쨌든 xargs의 효율성은 상실됩니다. 대략적인 해결 방법은 다음과 같습니다.
find . -iname "*.cpp" | grep "<pattern>" | while read -r x; do grep exa "$x"; done
파일 이름의 공백 문제가 발생할 때마다 대답은 변수에 큰따옴표였습니다.
답변3
find
모든 파일 이름 필터링을 수행 하는 데 사용됩니다 . 대신에
find . -name "*.cpp" | grep "foo" | xargs grep …
하다
find . -name "*.cpp" -name "*foo*" -print0 | xargs -0 grep …
다음과 같이 약간 더 복잡한 작업을 수행하고 싶다면
find . -name "*.cpp" | egrep "foo|bar" | xargs grep …
넌 할 수있어
find . -name "*.cpp" "(" -name "*foo*" -o -name "*bar*" ")" -print0 | xargs -0 grep …
다음 내용이 포함된 파일에도 적용되어야 합니다.개행 문자그들의 이름으로.
그리고 완전한 정규식의 강력한 기능이 필요한 경우 를 사용할 수 있습니다 -regex
.
답변4
이는 GNU 도구 없이도 작동합니다.
#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | perl -pe 's/\n/\0/' \
| xargs -0 grep "<content regex>"
이 perl
호출은 줄 바꿈을 널 문자로 대체하므로 xargs -0
입력이 공백이 아닌 줄로 해석될 수 있습니다.
GNU를 사용하면 호출을 제거 perl
하고 xargs -0 …
다음으로 변경할 수 있습니다.xargs -d "\n" …
GNU가 없나요 perl
? 시도 awk '{printf "%s%c", $0, 0}'
해봐.