나는 수십 년 동안 'grep'을 즐겼지만 몇 년 후 Linux를 떠났다가 다시 돌아왔을 때 'grep'이 이전과 다르게 작동하는 것을 발견했습니다. 웹에서 사용량을 확인하고 메모리가 손상되지 않았는지 확인했습니다.
*.h
일부 및 파일은 더 깊은 하위 디렉터리에 있다고 확신합니다 *.cpp
. 아래 명령을 사용했는데 예상치 못한 비슷한 결과가 나왔습니다.
grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*
나는 결과를 얻었다
grep: *.h: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c*: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris........svn-base
각기.
- command: 을 사용하면
grep 44738 -r -l .
첫 번째 줄을 제외하고 동일한 결과를 얻었습니다.grep: ...
- command: 를 사용하면 파일이
grep 44738 -r -l *.c*
전혀 없습니다grep: ...
. - 명령을 사용한 경우
grep 44738 -r -l -file *.c* .
:grep: *.c*: No such file or directory
결과는 몇 년 전의 내 경험과 거의 반대입니다. 내 질문은 다음과 같습니다
- ubuntu-18.04.6에 많은 변화가 있었나요
grep
? - grep에서 파일 패턴을 어떻게 지정합니까? 몇 년 전에 했던 것처럼 왜
*.c
같은 패턴을 사용할 수 없나요 ?*.h
*.c*
- 동료가 를 사용하라고 제안했지만
ack
거의 같은 것을 발견했습니다.grep
이전 처럼 전역 문자열 검색을 하려면 어떤 명령을 사용해야 합니까 ?
답변1
여기에는 두 가지 문제가 있습니다. 첫째, -r
또는 플래그를 결합할 수 없으며 -R
대상 파일 이름을 인수로 제공할 수도 없습니다. -r
/ 는 -R
"주어진 디렉터리의 모든 파일 검색"을 의미하는 재귀 검색을 활성화하여 grep
해당 인수를 파일을 찾을 디렉터리로 처리하게 합니다. 이름이 glob과 일치하는 디렉터리가 없기 때문에 *.c*
오류가 발생합니다. 보여주다. 내가 기억하는 한, 적어도 거의 25년 동안 Linux를 사용해 온 이래로 이런 일이 항상 있었습니다.
-r
/ 플래그 를 사용하지 않으면 원하는 대로 glob을 사용할 수 있습니다 -R
.하지만인용해야 합니다. 이것이 필수적입니다. 인용하지 않으면, glob은 쉘에 의해 일치하는 파일로 확장되고 grep
glob은 표시되지 않고 쉘 확장의 결과만 표시됩니다. 이름이 glob과 일치하는 현재 디렉터리입니다.
이제 grep
Linux의 기본값인 GNU에는 원하는 작업을 수행할 수 있는 방법이 있지만 구문은 다릅니다.
grep 44738 -r -l --include='*.h'
보다 man grep
:
--include=GLOB
Search only files whose base name matches GLOB (using wildcard
matching as described under --exclude). If contradictory
--include and --exclude options are given, the last matching
one wins. If no --include or --exclude options match, a file
is included unless the first such option is --include.