아래 조언을 따르십시오.이것질문, 아래와 같이 string
주어진 디렉토리의 내용에서 문자열을 재귀적으로 찾을 수 있습니다.dir
grep -r --exclude-dir='.*' string dir
그러나 다음과 같이 현재 디렉토리에 적용하면
$ grep -r --exclude-dir='.*' string .
$
--exclude-dir='.*'
해당 옵션은 현재 디렉토리가 일치하므로 숨겨진 것으로 무시하기 때문에 결과를 얻지 못합니다 '.*'
.
해결 방법은 상위 디렉터리로 변경한 cd ..
다음 해당 하위 디렉터리에서 명령을 실행한 다음 cd
원래 작업 디렉터리로 다시 돌아가는 것입니다. 디렉터리를 변경하지 않고 이 작업을 수행하는 데 사용할 수 있는 명령을 사용하는 해결 방법이 있어야 합니다.
현재 디렉터리의 내용을 파악하고 숨겨진 디렉터리의 내용을 무시하는 단일 명령은 무엇입니까?
답변1
GNU grep 2.11 이상을 사용하는 경우 -r
디렉토리가 지정되지 않으면 현재 디렉토리에서 시작됩니다.
grep -r --exclude-dir='.*' string
답변2
쉘 glob(파일 이름 패턴이라고도 함)에서는 .
특별한 의미가 없으며 *
0개 이상의 문자를 나타내고 ?
단일 문자를 나타냅니다.
제외하려는 항목은 다음과 같은 점입니다.마지막 하나문자 뒤에 임의 개수의 문자가 옵니다. 따라서 다음을 사용하십시오.
grep -r --exclude-dir='.?*' string .
답변3
숨겨진 디렉터리는 기본적으로 탐색 bash
되지 않으므로 (즉, 활성화되지 않음: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
답변4
내에서 재귀하나의디렉터리(하위 디렉터리의 숨겨진 파일을 제한하지 않음) 사용:
echo dir/*
디렉터리의 모든 파일이 인쇄되는 것처럼 특정 디렉터리의 파일에도 적용됩니다 .
$ grep -r "string" $(echo dir/*)
dir
(점) 으로 변경하면 .
원하는 것을 얻을 수 있습니다.
$ grep -r "string" $(echo ./*)
하위 디렉터리에 숨겨진 파일이 없는 경우 다음을 사용하세요.
$ grep -r --exclude-dir='.*' "string"
또는 찾기를 사용하세요:
find . -not -path '*/\.*' -type f -exec grep "string" {} \+