grep 정규 표현식을 사용하여 두 디렉터리 제외

grep 정규 표현식을 사용하여 두 디렉터리 제외

이것SE의 답변을 통해 정규식과 grep을 사용하여 디렉토리를 제외할 수 있다는 것을 깨달았습니다. 하지만 다음을 사용할 때는 작동하지 않습니다 |.

results=$(grep --color=always -rnF "$searchTerm" . --exclude-dir='.[^.]*|node_modules')
results=$(grep --color=always -rnF "$searchTerm" . --exclude-dir='.[^.]*\|node_modules')

마침표와 node_modules로 시작하는 디렉터리가 제외되도록 이 정규식을 작성하는 다른 방법이 있습니까?

답변1

적어도 GNU grep의 경우 --exclude정규식보다는 전역 패턴이 필요한 것 같습니다. 연결한 질문에 대한 대답은 그것이 말하는 것을 의미합니다."pcregrep과 grep에서 --exclude-dir의 의미가 다르다는 점에 유의하세요. 자세한 내용은 해당 매뉴얼을 읽어보세요.". 구체적으로:

존재하다 man grep:

  --exclude-dir=GLOB
          Skip any command-line directory with a name suffix that  matches
          the   pattern   GLOB.   When  searching  recursively,  skip  any
          subdirectory whose base name matches GLOB.  Ignore any redundant
          trailing slashes in GLOB.

존재하다 man pcregrep:

   --exclude=pattern
             Files (but not directories) whose names match the pattern are
             skipped  without  being processed. This applies to all files,
             whether listed on the command  line,  obtained  from  --file-
             list, or by scanning a directory. The pattern is a PCRE regu‐
             lar expression, and is matched against the final component of
             the  file  name,  not the entire path.

적어도 GNU grep에서는 --exclude-dir여러 패턴을 제외하려는 경우 여러 번 사용할 수 있습니다.

--exclude-dir='.?*' --exclude-dir='node_modules'

나는 그것을 .[^.]*다음과 같이 변경했습니다 .?*:

  • 여기 현재 디렉토리에서 검색하고 있기 때문에 그것이 의도인지 여부를 배제하지 않으려고 노력하는 것은 의미가 없습니다(객체 파일을 생략하면 기본적으로 최신 버전의 GNU로 설정됩니다. ..단, 적어도 GNU 3.11에서는 제외하지도 못한다는 사실을 발견했습니다) , 따라서 대상 디렉터리가 지정되지 않은 경우 이 버전이면 충분합니다.-r.grepgrep--exclude-dir='*'--exclude-dir='.*'
  • ..foo이는 또는 이름이 지정된 디렉토리를 제외하지 않습니다 ....
  • 정규식에 해당하는 POSIX glob은 다음 [^.]과 같습니다 [!.]( [^.]적어도 GNU 시스템에서는 일반적으로 지원되지만).

답변2

왜 그것을 사용하지 않습니까 find?

tree -a
.
├── node_modules
│   ├── a
│   ├── b
│   └── c
├── .test
│   ├── 1
│   ├── 2
│   └── 3
└── x
    ├── 001
    └── 002

3 directories, 8 files

find . \( ! -path './node_modules*' -a ! -path './.*' \)
.
./x
./x/002
./x/001

마침내:

find . \( ! -path './node_modules*' -a ! -path './.*' \) \
    -exec grep --color=always -nF "$searchTerm" {} +

관련 정보