이 질문 과 같은 질문을하는 것처럼 들릴 수 있지만 요구 사항이 다릅니다. 다음은 내 파일 시스템의 예입니다.
- / code /
- internal /
- dev /
- main /
- public /
- dev /
- main /
- release /
- 도구 /
- internal /
/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 -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
가이 arg 목록과 함께 호출됩니다. uments (원래 명령에서도 마찬가지입니다. grep
는 *
를 볼 수 없습니다. 확장은 grep
를 호출하기 전에 bash
에 의해 완전히 수행됩니다.
grep: /code/internal/dev/*.cs: No such file or directory
명령에서*.cs
. 원래 내 질문에*.cs
를 넣었 기 때문에 이것은 내 잘못입니다.