/ proc와 raw 디스크에서`grep ‘을하는 정확한 이유는 무엇입니까? 효과가 없었다.

나는 grep -r "searchphrase" /오늘 달렸고 그것은 효과가 없었다. 나는 약간의 연구를했고 find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"올바른 접근 방식으로 밝혀 졌습니다.

나는 성공하지 못한 grep에 대한 범인 /proc과 같은 디스크를 모으고 디스크를 /dev/sda1만듭니다.

“왜”에 대한 깊은 기술적 배경을 갖고 싶습니다. 나는 /proc통과 할 때 무한 링크를 만드는 내부 링크가 있다고 생각하며 더 많은 이유가 있지만 특정하지는 않습니다.

또한 원시 디스크가 잘릴 경우 어떻게됩니까? 파일 시스템 유형의 a /dev/sda1mount디스크의 데이터를 이해하기 쉽기 때문에 이진 데이터 ( 내가 아는 한 액세스 할 수 있습니까)를 해석 할 수 없습니까? 따라서 여전히 이진 문자열을 잡을 수 있습니까?



답변

예, 당신은 할 수 grep /dev/sda1/proc하지만 당신은 아마 싶지 않아. 더 자세하게:

  1. 예,의 바이너리 내용을 grep 할 수 있습니다 /dev/sda1. 그러나 현대의 대형 하드 디스크에서는 시간이 오래 걸리고 결과가 유용하지 않을 수 있습니다.

  2. 그렇습니다. 내용을 정리할 수는 /proc있지만 컴퓨터의 메모리는 파일로 매핑되어 있습니다. 기가 바이트의 RAM이 장착 된 최신 컴퓨터에서는 grep하는 데 시간이 오래 걸리고 결과가 유용하지 않을 수 있습니다.

예외적으로, 파일 시스템이 손상된 하드 디스크 grep something /dev/sda1에서 데이터를 찾는 경우 파일 데이터 복구 시도의 일부로 실행될 수 있습니다 .

다른 문제가있는 파일 /dev

/dev인내심이 충분하다면 하드 디스크와 하드 디스크 파티션 이 손상 될 수 있습니다. 그러나 다른 파일 (hat tip : user2313067 )은 문제를 일으킬 수 있습니다.

  1. /dev/zero무한 길이의 파일입니다. 다행히도 grep(적어도 GNU 버전)은 그것을 건너 뛸 정도로 똑똑합니다.

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/random그리고 /dev/urandom또한 무한하다. 중지하라는 신호가 grep something /dev/random없으면 명령 이 영원히 실행됩니다 grep.

    /dev/urandom암호를 생성 할 때 grep하는 것이 유용 할 수 있습니다 . 예를 들어 5 개의 임의의 영숫자 문자를 얻으려면 :

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    문자를 충분히받은 후 head파이프를 닫아서 grep을 종료시키기 때문에 이것은 무한하지 않습니다 .

무한 루프

“… 링크 … 횡단 할 때 무한 루프 생성 …”

Grep (적어도 GNU 버전)은 그렇게하지 않을만큼 똑똑합니다. 두 가지 경우를 고려해 봅시다.

  1. -r옵션을 사용하면 grep 명령 줄에 명시 적으로 지정되어 있지 않으면 심볼릭 링크를 따르지 않습니다 . 따라서 무한 루프는 불가능합니다.

  2. -R옵션을 사용하면 grep 기호 링크를 따르지만이를 확인하고 루프에 걸리지 않습니다. 설명하기 위해 :

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

문제가있는 디렉토리에서 제외 grep -r

옆으로, grepgrep이 특정 파일이나 디렉토리를 검색하지 못하게하는 제한된 기능을 제공합니다. 예를 들어, 모든 디렉토리 이름을 제외 할 수 있습니다 proc, sys그리고 dev와 그렙의 재귀 검색에서 :

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

또한, 우리는 제외 할 수 있습니다 proc, sys그리고 dev떠들썩한 파티의 확장 globs의 사용 :

shopt -s extglob
grep -r something /!(proc|sys|dev)


답변