it-swarm-ko.tech

패턴을 찾은 파일 만 찾고 반향

나는 이것을 많이 사용했지만 달성하려는 개선은 grep에서 일치하지 않는 에코 파일 이름을 피하는 것입니다. 더 좋은 방법은?

    for file in `find . -name "*.py"`; do echo $file; grep something $file; done
17
Gang

GNU grep을 사용하는 경우 -r 또는 --recursive이 간단한 찾기를위한 옵션 :

grep -r --include '*.py' -le "$regexp" ./ # for filenames only
grep -r --include '*.py' -He "$regexp" ./ # for filenames on each match

고급 술어가 더 필요한 경우 find 만 있으면됩니다.

6
Toby Speight

Grep에게 파일 이름을 출력에 포함하도록 지시 할 수 있습니다. 일치하는 것이 있으면 콘솔에 표시됩니다. 파일 내에 일치하는 항목이 없으면 해당 파일에 대한 행이 인쇄되지 않습니다.

find . -name "*.py" | xargs grep -n -H something

로부터 man grep :

-H       Always print filename headers with output lines
-n, --line-number
         Each output line is preceded by its relative line number in the file, starting at line 1.  The line number counter is reset for each file processed.
         This option is ignored if -c, -L, -l, or -q is specified.

파일에 공백이있는 이름이있을 경우 NUL 문자를 구분 기호로 사용하도록 파이프를 전환해야합니다. 전체 명령은 이제 다음과 같습니다.

find . -name "*.py" -print0 | xargs -0 grep -n -H something
5
rollstuhlfahrer

사용 -l 인수.

for file in `find . -name "*.py"`; do grep -l something $file && grep something $file; done

더 까다로운 사용법은 다음과 같습니다.

for file in $(find . -name '*.py' -exec grep -l something '{}' +); do echo "$file"; grep something $file; done
1
kmkaplan

기본적으로 결과를 원하는 형식으로 출력하는 grep 대안이 있습니다. 내가 아는 가장 인기있는 것은 ag ( "은색 검색기")와 ack입니다. ag은 (는) ack의 빠른 대안으로 보급되었습니다.

$ ag '^\w+\s*\w+\(' ~/build/i3/src
build/i3/src/display_version.c
58:void display_running_version(void) {

build/i3/src/load_layout.c
42:static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings =
518:json_content_t json_determine_content(const char *filename) {
575:void tree_append_json(Con *con, const char *filename, char **errormsg) {

build/i3/src/x.c
64:CIRCLEQ_HEAD(state_head, con_state) state_head =
67:CIRCLEQ_HEAD(old_state_head, con_state) old_state_head =
70:TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head =
97:void x_con_init(Con *con, uint16_t depth) {
...

나는 여기에 당신을 보여줄 수 없지만 출력물은 깔끔하게 채색됩니다. 나는 올리브 녹색으로 파일 이름을 얻었고, 줄 번호는 금색으로, 각 줄에서 일치하는 조각은 붉은 색으로 나타납니다. 색상은 사용자 정의 할 수 있습니다.

1
JoL

다음과 같은 것을 시도해 볼 수 있습니다.

find . -name "*.py:" -exec grep -l {} \;

Find 명령 및 표준 find 명령 기능으로 발견 된 모든 파일에 대한이 exec grep 명령

1
Romeo Ninov