나는 grep을 사용하여 다음 패턴이 포함된 일부 tex 파일을 찾으려고 합니다 ->-
.
grep -R -- "->-" *.tex
그러나 이것은 작동하지 않습니다. 만약 내가한다면:
grep -R -- "->-"
대신 작동하지만 매우 느리고 명확하게 tex 파일뿐만 아니라 다른 많은 파일(예: 바이너리 파일)과도 일치합니다.
이 검색을 수행하는 가장 빠른 방법은 무엇입니까?
답변1
다음을 사용해 보세요 :find
grep
-exec
find path_to_tex_files_directory -name "*.tex" -exec grep -- "->-" {} \;
또는xargs
find path_to_tex_files_directory -name "*.tex" | xargs grep -- "->-"
답변2
문제는 디렉토리의 모든 파일을 검색하도록 재귀에 -R
지시하는 것 입니다. grep
따라서 특정 파일 그룹과 결합할 수 없습니다. 그래서 당신은 사용할 수 있습니다find
@KM이 제안한대로.또는 쉘 와일드카드:
$ shopt -s globstar
$ grep -- "->-" **/*.tex
이 shopt
명령은 bash의 globstar 기능을 활성화합니다:
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
그런 다음 현재 디렉터리와 하위 디렉터리의 모든 파일 **/*.tex
과 일치하는 패턴을 제공합니다 ..tex
this 을 사용하는 경우 기본적으로 이를 수행하므로 (어쨌든 bash 기능이므로) zsh
필요하지 않습니다 .shopt
zsh
답변3
1 을grep
지원 하는 경우 다음 스위치를 사용할 수 있습니다 .--include
grep -R --include '*.tex' -- "->-"
또는
grep -R --include='*.tex' -- "->-"
1:
최소한 GNU에서는 사용 가능 grep
:
--include=GLOB
Search only files whose base name matches GLOB
및 운영 체제 grep
:
--include
If specified, only files matching the given filename pattern are searched.
답변4
-R
옵션은 재귀를 의미합니다. *.tex 패턴의 디렉토리가 없는 것 같습니다.
어쩌면 다음과 같이 시도해 보세요:
find . -name \*.tex -exec grep -l -- "->-" {} \;
-l
파일 이름에 관심이 없다면 옵션을 제거할 수 있습니다.파일 이름과 모드를 보려면:
find . -name \*.tex -exec grep -l -- "->-" {} \; | xargs grep -- "->-"
그러나 이것은 이중 grep입니다. @KM의 솔루션이 더 좋아 보입니다.