"grep -rn"은 두 가지 예상 결과 중 하나만 생성합니다.

"grep -rn"은 두 가지 예상 결과 중 하나만 생성합니다.

디렉토리 구조에서 특정 단어가 포함된 모든 파일을 찾으려고 하는데 작동하지 않습니다.

  • 예를 들어, 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작동하는 방식입니다. 당신은 grepGNU 입니까 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 grepgrep을 실행하기 전에 사용 /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.

이것이 당신이 요구하는 것입니까?

관련 정보