Grep 패턴에는 대시가 포함되며 파일 확장자로 제한됩니다.

Grep 패턴에는 대시가 포함되며 파일 확장자로 제한됩니다.

나는 grep을 사용하여 다음 패턴이 포함된 일부 tex 파일을 찾으려고 합니다 ->-.

grep -R -- "->-" *.tex

그러나 이것은 작동하지 않습니다. 만약 내가한다면:

grep -R -- "->-"

대신 작동하지만 매우 느리고 명확하게 tex 파일뿐만 아니라 다른 많은 파일(예: 바이너리 파일)과도 일치합니다.

이 검색을 수행하는 가장 빠른 방법은 무엇입니까?

답변1

다음을 사용해 보세요 :findgrep-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필요하지 않습니다 .shoptzsh

답변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의 솔루션이 더 좋아 보입니다.

관련 정보