디렉토리 구조에서 특정 단어가 포함된 모든 파일을 찾으려고 하는데 작동하지 않습니다.
- 예를 들어, path 에서 실행하면
/Institute/IITDhanbad/
다음 명령이 실행됩니다.
결과는grep -rn "Programmer" *
BTECH/CompScience.txt:22: Sudip is a Programmer
- 그러나 경로에서 실행하면
/Institute/IITDhanbad/MTECH
동일한 명령이 제공됩니다.CSP/Boys/Good/Electronics.txt:13: Sourav is a Programmer
문제는 폴더 grep
에서 호출을 실행할 때 예상되는 결과 /Institute/IITDhanbad/
는 다음과 같습니다.둘 다결과는
BTECH/CompScience.txt:22: Sudip is a Programmer
MTECH/CSP/Boys/Good/Electronics.txt:13: Sourav is a Programmer
무엇이 잘못되었고 어떻게 해결하나요?
추가 정보:
파일 형식 및 액세스 권한은 다음과 같습니다.
문서 모델 MTECH
drwxrwsr-x
BTECH
drwxrwsr-x
CSP
lrwxrwxrwx
ls -ld
/Institute/IITDhanbad/
경로 에서 :drwxrwsr-x 4 suresh faculty 4096 Sep 16 00:53
ls -ld
/Institute/IITDhanbad/MTECH
경로 에서 :drwxrwsr-x 4 suresh faculty 4096 Sep 16 00:53
ls -ld
/Institute/IITDhanbad/MTECH/CSP
경로 에서 :dr-xr-sr-t 4 ganesh faculty 4096 Sep 12 20:58 .
답변1
CSP
기호 링크입니다( 참조 l
) lrwxrwxrwx
. 분명히 grep
인수로 제공된 것 이외의 심볼릭 링크를 따르지 않는 것 같습니다. -r
이 작업을 수행할 때:
grep -rn "Programmer" *
CSP
(에 있는 /Institute/IITDhanbad/MTECH/
, 맞죠?) 의 상위 디렉토리에서는 CSP
쉘이 확장된 후 인수로 나타납니다 *
. 그러나 "상위" 디렉토리(in ) /Institute/IITDhanbad/
에서 이 작업을 수행하는 경우 이는 CSP
매개변수가 아니며 grep
재귀 스캔 중에 발견된 심볼릭 링크입니다.
이것이 GNU가 grep
작동하는 방식입니다. 당신은 grep
GNU 입니까 grep
? 그렇다면 설명서를 참조하세요 -R
. -R
좋아 -r
하지만 그것하다심볼릭 링크를 따르십시오.
grep -rn "Programmer" .
상위 디렉터리에서 작업을 수행 한 경우 CSP
이는 CSP
매개변수로 표시되지 않습니다. 의 사용은 *
관찰한 결과에 매우 중요합니다.
답변2
답변
GNU grep 매뉴얼이 옵션은 -r
디렉토리 계층 구조의 상위 심볼릭 링크가 아닌 직접 심볼릭 링크(명령줄에 제공된 링크)만 따르도록 선언합니다.
-아르 자형
--재귀
각 디렉터리 피연산자에 대해 디렉터리의 모든 파일을 반복적으로 읽고 처리합니다. 명령줄에서 기호 링크를 따르되 재귀적으로 나타나는 기호 링크는 건너뜁니다. 파일 피연산자가 제공되지 않으면 grep은 작업 디렉토리를 검색합니다. 이는 "--directories=recurse" 옵션과 동일합니다.
따라서 주어진 텍스트를 검색할 때 지정된 MTECH 디렉토리 내의 직접 심볼릭 링크인 CSP 디렉토리는 통과되지 않습니다.
참고: 질문을 명확히 하기 전에 이전 답변은 다음과 같습니다.
문제의 가능한 원인
하위 디렉터리 MTECH는 실행 권한 비트를 설정할 수 없습니다. 예를 들어:
$ mkdir -p one/two
$ cd one
$ cat <<EOT > test.txt
abc def
EOT
$ cp test.txt two
$ grep -rn def *
test.txt:1:abc def
two/test.txt:1:abc def
$ chmod -x two
$ grep -rn def *
test.txt:1:abc def
grep: two/test.txt: Permission denied
물론, 이렇게 하면 stderr에 오류 메시지가 표시됩니다. 하지만 만약에grep을 별칭으로 설정도착하다 /usr/bin/grep -s
:
$ alias grep='/usr/bin/grep -s'
$ grep -rn def *
test.txt:1:abc def
이것이 퍼즐의 마지막 조각일 수도 있습니다.
해결책
unalias grep
grep을 실행하기 전에 사용 /usr/bin/grep
하거나 grep
.
답변3
간단히 cmd를 실행하여 접근 방식을 단순화할 수 있습니다.
target_dir="/path/to/directory/of/interest"
[ -d "$target_dir" ] && grep -rn -e "Programmer" "$target_dir"
또는 시도한 것과 비슷하지만 파일 피연산자에 대한 테스트를 디렉터리로 포함합니다.
target_dir="/path/to/directory/of/interest"
[ -d "$target_dir" ] && cd "$target_dir" && grep -rn -e "Programmer"
-r
파일 피연산자를 제공하지 않고 recurse()를 사용하는 것은 아래에서 반복하는 것과 동일한 사실을 갖습니다 $PWD
.
이것이 당신이 요구하는 것입니까?