이 질문의 조언에 따라 문자열에 대해 반복적으로 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
댓글
Answer
셸 glob (파일 이름 패턴이라고도 함)에서 .
는 특별한 의미가 없습니다. *
0 개 이상의 문자를 의미하고 ?
는 단일 문자를 의미합니다.
제외하려는 것은 점과 최소 1 개 em입니다. > 문자를 입력 한 다음 원하는 수의 문자를 입력합니다. 따라서 다음을 사용하십시오.
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*
가 ' 숨겨진 디렉토리 / 파일을 포함하도록 확장하지 마십시오.dotglob
가shopt -s dotglob
로 설정되지 않은 경우.grep -r foo .
및 귀하 '은 숨겨진 디렉토리가 grep에 의해 통과되는 것을 볼 수 있습니다. 또는shopt -s dotglob
를 입력 한 다음grep -r foo *
를 입력하세요. - 적합한 포인트; 내 대답에서 이것을 명확히했습니다.
- 명령 줄 인수에 포함 된 숨겨진 디렉토리의 파일을 계속 검색합니다. 다양한 효과가있을 것입니다. 대부분의 경우 괜찮을 수 있지만 " pi " 정의와 같은 ' " 3.1416 "로; 주의 사항을 더 잘 알 수 있습니다.
답변
좋아요 :
grep -r --exclude-dir=".*" string "$(pwd)"
댓글
- 대체 명령 인용 :
"$(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" {} \+
grep
를 사용하면 다음을 생성합니다.grep: warning: recursive search of stdin