grep을 사용하여 중첩되지 않은 여러 디렉토리를 검색하려면 어떻게해야합니까?


21

이 질문 과 같은 것을 묻는 것처럼 들릴 수 있지만 요구 사항이 다릅니다. 이것은 내 파일 시스템의 예입니다.

  • /암호/
    • 내부의/
      • dev /
      • 본관/
    • 공공의/
      • dev /
      • 본관/
      • 해제/
    • 도구 /

/code/internal/dev/, /code/public/dev//code/tools/여러 프로젝트에 대한 하위 디렉토리가 포함되어 있습니다. 나는 /code/internal/and 의 dev 브랜치에서 거의 독점적으로 일하고 /code/public/있으며 종종 디렉토리 /code/tools/가없는 (디바이스가없는) 디렉토리에서 텍스트 문자열을 검색하려고합니다 . 이 경우 세 가지 별도의 명령을 수행해야합니다.

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

이 작업을 수행하는 단일 명령이 있는지 알고 싶습니다. 그렇지 않다면 간단한 bash 스크립트를 작성해야 할 것입니다.

답변:


38

grep이 찾을 여러 경로를 연결할 수 있습니다.

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

이것은 너무 분명하다. 왜 내가 이것을 생각하지 않았습니까?!
David Kennedy

실제로 명령에서를 grep: /code/internal/dev/*.cs: No such file or directory제거하지 않으면 오류가 발생 *.cs합니다. 내가 *.cs원래 내 질문에 넣었 기 때문에 이것은 내 잘못이다 .
David Kennedy

14

와일드 카드를 최대한 활용하려면 (및 게시 한 계층 구조가 완료된 경우) 할 수 있습니다

grep -r "some string" /code/{*/dev,tools}/*.cs

설명:

첫 번째 단계는 가새 목록의 확장입니다. foo{bar,baz}qux로 확장됩니다 foobarqux foobazqux. 즉, 목록에 쉼표로 구분 된 각 항목에 대해 별도의 단어가 생성되며 접두사와 접미사 부분이 각각 첨부됩니다. 당신은 그렇게함으로써 어떻게 작동하는지 볼 수 있습니다

echo A{1,2,3,4}B

어떤 출력

A1B A2B A3B A4B

이것은 여러 개의 중괄호와 빈 인수로도 작동합니다. 예를 들어

echo {,1,2}{0,1,2}:{2,3}

준다

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

따라서 중괄호 확장 후 명령은 다음과 같습니다.

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

다음 단계는 와일드 카드 확장입니다. 당신은 이미*.cs 부분에 있지만 중간 디렉토리에서도 작동합니다. 또한 /다음과 같은 경우 디렉토리 만 일치합니다. 따라서 계층 구조와 파일의 파일 이름을 구성 .cs하면 다음 명령을 얻을 수 있습니다.

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

모든 일이 일어난 후에 만, grep이 인수의 목록이라고합니다 (같은 원래 명령으로 발생합니다; grep을 참조하는 얻을 수 없다 *, 즉 완전하게 수행되고 확장 bash호출하기 전에 grep).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.