이것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
.
grep
grep
--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" {} +