질문의 조언에 따라 문자열에 대해 반복적으로 grep 할 수 있습니다. string 주어진 디렉토리의 콘텐츠 내 dir 다음과 같이

grep -r --exclude-dir=".*" string dir 

그러나 이것을 현재 디렉토리에 적용하면

$ grep -r --exclude-dir=".*" string . $ 

--exclude-dir=".*" 옵션은 ".*"와 일치하므로 현재 디렉토리를 숨김으로 생략합니다.

해결 방법은 그런 다음 해당 하위에서 명령을 실행 한 다음 cd 다시 원래 작업 디렉토리로 돌아갑니다. 디렉토리 변경에 대한 해결 방법없이이 작업을 수행하는 데 사용할 수있는 단일 명령이 있어야합니다.

grep 콘텐츠에 대한 단일 명령은 무엇입니까? 현재 디렉토리 중 숨겨진 디렉토리의 내용을 생략 하시겠습니까?

답변

GNU grep 2.11 이상을 사용하는 경우 디렉토리를 지정하지 않으면 -r가 현재 디렉토리에서 시작됩니다.

grep -r --exclude-dir=".*" string 

댓글

  • 버전 메모를 포함하면 좋습니다. BSD grep를 사용하면 다음을 생성합니다. grep: warning: recursive search of stdin

Answer

셸 glob (파일 이름 패턴이라고도 함)에서 .는 특별한 의미가 없습니다. * 0 개 이상의 문자를 의미하고 ?는 단일 문자를 의미합니다.

제외하려는 것은 점과 최소 1 개 문자를 입력 한 다음 원하는 수의 문자를 입력합니다. 따라서 다음을 사용하십시오.

grep -r --exclude-dir=".?*" string . 

답변

는 기본적으로 grep 숨겨진 디렉토리를 트래버스하지 않습니다 (즉, dotglob를 사용하지 않음 :

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

숨겨진 파일 만 제외 :

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

댓글

  • 댓글이없는 반대표의 이유가 궁금합니다.
  • 나는 반대표를 '하지 않았지만 '는 grep가 숨겨진 디렉토리를 통과하지 '하지 않는다는 사실이 아닙니다. ' grep -r foo *에서 다시 볼 수있는 것은 shell glob *가 ' 숨겨진 디렉토리 / 파일을 포함하도록 확장하지 마십시오. dotglobshopt -s dotglob로 설정되지 않은 경우. grep -r foo . 및 귀하 '은 숨겨진 디렉토리가 grep에 의해 통과되는 것을 볼 수 있습니다. 또는 shopt -s dotglob를 입력 한 다음 grep -r foo *를 입력하세요.
  • 적합한 포인트; 내 대답에서 이것을 명확히했습니다.
  • 명령 줄 인수에 포함 된 숨겨진 디렉토리의 파일을 계속 검색합니다. 다양한 효과가있을 것입니다. 대부분의 경우 괜찮을 수 있지만 " pi " 정의와 같은 ' " 3.1416 "로; 주의 사항을 더 잘 알 수 있습니다.

답변

좋아요 :

grep -r --exclude-dir=".*" string "$(pwd)" 

댓글

답변

단일 디렉토리 (하위 디렉토리 숨김 파일을 제한하지 않음) 사용 :

echo dir/*는 dir 내의 모든 파일을 인쇄하므로 일부 dir 내의 파일에 대해 작동합니다.

$ grep -r "string" $(echo dir/*) 

dir. (점)으로 변경하고 원하는 것을 정확히 얻을 수 있습니다.

$ grep -r "string" $(echo ./*) 

필요한 것이 하위 디렉토리에 숨겨진 파일이없는 경우 다음 중 하나를 사용합니다.

$ grep -r --exclude-dir=".*" "string" 

또는 찾기 사용 :

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

답글 남기기

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