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

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • 도구 /

/code/internal/dev/, /code/public/dev//code/tools/에는 여러 프로젝트의 하위 디렉터리가 포함되어 있습니다. 저는 거의 독점적으로 /code/internal//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 스크립트.

A nswer

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

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

댓글

  • 정말 당연합니다. 왜 ' 생각하지 않았습니까?!
  • 사실,이 경우 오류가 발생합니다. grep: /code/internal/dev/*.cs: No such file or directory 명령에서 *.cs. 원래 내 질문에 *.cs를 넣었 기 때문에 이것은 내 잘못입니다.

답변

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

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

설명 :

첫 번째 단계는 중괄호 목록을 확장하는 것입니다. foo{bar,baz}quxfoobarqux 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가이 arg 목록과 함께 호출됩니다. uments (원래 명령에서도 마찬가지입니다. grep*를 볼 수 없습니다. 확장은 grep를 호출하기 전에 bash에 의해 완전히 수행됩니다.

답글 남기기

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