하나의 내장 명령으로 하위 디렉토리의 파일에서 하위 문자열을 찾으십니까?


10

Windows에서 모든 하위 디렉토리의 모든 파일에서 문자열을 찾으려면 다음과 같이하십시오.

findstr /C:"the string" /S *.h

그러나 Linux (예 : Ubuntu) find에서는 xargs, 및 관련 파이프 명령 이외의 다른 방법을 찾지 못했습니다 grep(예 :이 페이지에는 하위 디렉토리를 통해 재귀 적으로 grep 할 수 있습니까? ). 그러나 내 질문은 다릅니다 : 쉘 스크립트를 작성하지 않고도이 마술을 통해 작동하는 내장 명령 이 있습니까?

답변:


19

GNU grep을 사용하면 하위 디렉토리를 통해 재귀 적으로 검색 할 수 있습니다.

grep -r --include='*.h' 'the string' .

수수께끼 ... 나는 언제 어디서나 'M'을 볼 수 있지만, - : 우분투에서이 정확한 명령 줄을 시도했지만 " 'M'을 잘못된 옵션을 그렙"을 얻을
귀도 Domenici

@Guido 여기 잘 작동
phunehehe

A의 제안 편집 TomasG는 마지막으로 변경할 것을 권장 *'*'"마지막 와일드 카드를 인용 피 오류에 필요한 경우 일부 파일 이름 시작 -"
마이클 Mrozek

이상한 사건이 발생하면 원래 답변에 입력 된대로 작동합니다. 감사!
Guido Domenici

1
@Guido : 문제는 현재 디렉토리의 파일 -Msomething또는 GREP_OPTIONS설정 때문일 수 있습니다 .
Gilles 'SO- 악마 그만'

2

grep -r searchpattern /path/to/start/in

어디 /path/to/start/in/"단지가 될 수 .는 현재 디렉토리".



0

이 마법을 통해 작동 하는 하나의 내장 명령 이 있습니까?

놀랍게도, 그러한 명령이 있다고 가정 할 수는 없습니다 .

유닉스에는 여러 가지 구현이 있으며 각각 다른 단점이 있습니다. 공통 분모 (및 Unices에서 표준에 가장 가까운 것) 인 POSIX는에 대해 이러한 옵션을 지정하지 않습니다grep .

다른 답변에서 언급했듯이 GNU의 구현 grep에는 원하는 작업을 수행하는 비표준 옵션이 있습니다. 이 특정 구현은 Linux 시스템에서 일반적 일 수 있지만 Unix, 심지어 일부 Linux 시스템에서도 가용성을 가정 할 수는 없습니다.

마지막으로, 한 번에 모든 것을 시도하는 하나의 큰 모 놀리 식 실행 파일을 사용하는 것보다 여러 원시 프로그램의 조합을 선호하는 것이 유닉스 철학 이라는 것을 언급해야합니다 .

귀하의 경우 파일 시스템을 크롤링하고 스트림에서 정규 표현식을 일치시키는 것은 두 가지 별도의 작업입니다. 각각을 별도의 프로그램으로 취급하는 것은 정상입니다.


0

주어진 디렉토리에서 문자열을 찾으려면 아래 명령을 사용하십시오

find <fullDirectoryPath> -name '*' -exec grep -l '<StringToFind>' {} \;

예를 들면 다음과 같습니다.

find /apps_bev/apps/xfer/export/02210 -name '*' -exec grep -l '38221000001032' {} \;

1
grep하나 이상의 파일을 인수로 사용할 수 있으므로 파일 당 하나의 호출을 실행하는 것을 피하기 위해 +대신 사용해야 합니다 . \;grep
Stéphane Chazelas

1
주의 -name '*'이름 (일부에서 현재의 지역에서 유효한 텍스트입니다 파일을 제한합니다 find적어도 구현), 그러나 다른 디렉토리 구성 요소가 여전히 유효한 문자를 형성하지 않는 바이트의 시퀀스를 포함 할 수있다. 의도가 -name '*'잘못된 출력을 가진 파일을 생략하여 출력이 유효한 텍스트인지 확인하려는 경우 find ... ! -name '*' -prune -o -exec grep ... {} +, 대신 이름을 사용 하는 find디렉토리로 내려가는 것을 막을 것 입니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.