나는 이것을 많이 사용했습니다. 내가 달성하려는 개선은 일치하지 않는 에코 파일 이름을 피하는 것입니다. grep. 더 나은 방법은 무엇인가요?

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

댓글

답변

 find . -name "*.py" -exec grep something {} \; -print  

일치하는 줄 뒤에 파일 이름을 인쇄합니다.

 find . -name "*.py" -exec grep something /dev/null {} +  

일치하는 모든 줄 앞에 파일 이름을 인쇄합니다 ( 하나 만있는 경우에는 /dev/null를 추가합니다. > grep와 일치하는 파일은 “검색 할 파일이 하나만 전달 된 경우”파일 이름을 인쇄하지 않습니다. grep에는 -H 옵션이 있습니다.

 find . -name "*.py" -exec grep -l something {} +  

일치하는 줄이 하나 이상있는 파일의 파일 이름 만 인쇄합니다.

일치하는 줄 앞에 파일 이름을 인쇄하려면 awk를 사용할 수 있습니다. 대신 :

 find . -name "*.py" -exec awk " FNR == 1 {filename_printed = 0} /something/ { if (!filename_printed) { print FILENAME filename_printed = 1 } print }" {} +  

또는 grep 각 파일에 대해 두 번- “하나 이상의 grep 명령을 실행하고 각 파일에 대해 최대 2 개를 실행하므로 효율성이 떨어집니다 (그리고 파일 내용을 두 번 읽음). ) :

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

어쨌든 find의 출력을 이와 같이 반복하지 않으려면 변수 .

GNU 도구와 함께 셸 루프를 사용하려는 경우 :

 find . -name "*.py" -exec grep -l --null something {} + | xargs -r0 sh -c " for file do printf "%s\n" "$file" grep something < "$file" done" sh  

(FreeBSD 및 파생 제품에서도 작동합니다).

답변

I 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 만 필요 고급 술어.

주석

  • GNU 버전에 따라 다름 grep, grep는 심볼릭 링크 내부를 보거나 디렉터리로 심볼릭 링크를 트래버스 할 수도 있고 그렇지 않을 수도 있습니다. 다른 유형의 비정규 파일 처리에도 약간의 차이가있을 수 있습니다.

답변

사용자 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 

Answer

다음과 같이 시도해보십시오.

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

모든 파일에 대한이 exec grep 명령은 find 명령과 표준 찾기 명령 기능으로 발견됩니다.

답변

-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 

답변

저기 기본적으로 원하는 형식으로 결과를 출력하는 grep 대안입니다. 내가 아는 가장 인기있는 두 가지는 ag (일명 “은색 검색 자”)와 ack입니다. agack의 빠른 대안으로 광고됩니다.

$ 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) { ... 

여기서 보여 드릴 수는 없지만 출력물은 깔끔하게 색상이 지정되어 있습니다. 파일 이름은 올리브색 녹색, 줄 번호는 금색 노란색, 일치하는 부분은 붉은 색으로 표시됩니다. 색상은 사용자 정의 할 수 있습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다