전체 파일 시스템에서 텍스트를 검색하는 방법은 무엇입니까?

전체 파일 시스템에서 텍스트를 검색하는 방법은 무엇입니까?

grep 도구를 사용해야 하고 전체 파일 시스템에서 "800x600"이라는 텍스트 문자열을 검색한다고 가정해 보겠습니다.

나는 시도했다:

grep -r 800x600 /

하지만 작동하지 않습니다.

내 명령이 수행해야 하는 작업은 루트 아래의 모든 파일/폴더를 반복적으로 grep하여 "800x600" 텍스트를 찾고 검색 결과를 나열하는 것이라고 생각합니다.

내가 뭘 잘못했나요?

답변1

나는 일반적으로 grep여러 파일을 실행하기 위해 다음 스타일의 명령을 사용합니다.

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

실제로 수행하는 작업은 시스템의 모든 파일을 나열한 다음 각 파일에 대해 grep지정된 인수와 각 파일 이름을 사용하여 실행하는 것입니다.

-xdev매개변수는 다른 파일 시스템을 무시해야 함을 알려줍니다. 이는 특수 파일 시스템을 피하는 데 좋습니다. /proc그러나 일반 파일 시스템도 무시합니다. 예를 들어 /home 폴더가 다른 파티션에 있으면 검색되지 않습니다. - 말해야 해 find / /home -xdev ....

-type f파일만 검색한다는 의미이므로 디렉토리, 장치 및 기타 특수 파일은 무시됩니다(여전히 디렉토리로 재귀하여 그 안에 있는 파일에서 실행됩니다 . 디렉토리 자체에서는 실행 grep되지 않으므로 어쨌든 작동하지 않습니다) grep) . 옵션은 항상 출력에 파일 이름을 인쇄하도록 -H지시합니다 .grep

find파일 목록을 필터링하는 다양한 옵션을 허용합니다. 예를 들어 -name '*.txt'.txt로 끝나는 파일만 처리됩니다. -size -2M2MB보다 작은 파일을 나타냅니다. -mtime -5지난 5일 이내에 수정된 파일을 나타냅니다. 함께 결합하려면 -a for를 사용하세요.그리고그리고 -o또는, '('괄호를 사용하여 ')'표현식을 그룹화합니다(쉘이 해석하지 못하도록 따옴표로 묶음). 예를 들어:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

man find가능한 필터의 전체 목록을 확인하세요 .

답변2

일반적으로 시스템의 모든 내용을 실제로 검색하고 싶지는 않을 것입니다. Linux는 모든 작업에 파일 노드를 사용하므로 일부 "파일"은 검색하려는 대상이 아닙니다. 예를 들어 /dev/sda첫 번째 하드 드라이브의 물리적 블록 장치입니다. 원시 디스크 장치 대신 마운트된 파일 시스템을 검색할 수 있습니다. 또 다른 /dev/random방법은 읽을 때마다 무작위로 데이터를 출력하는 것입니다. 검색해봐도 별 의미가 없습니다. 귀하의 경우 파일 시스템에도 문제가 있습니다 /proc.

저는 두 가지 중 하나를 추천하고 싶습니다.

  1. 루트에서 검색하지 말고 유용할 수 있는 부분만 검색하세요. /home또는 또는 각각 을 검색하세요 /usr. /etc귀하가 찾고 있는 정보는 특정 유형일 수 있으므로 특정 폴더에 위치할 수 있습니다. 구성 설정은 에 있어야 합니다 /etc. 개인 데이터 파일은 에 있어야 합니다 /home. 이와 같은 주요 영역으로 검색을 제한하면 재귀 grep 문제가 크게 줄어듭니다.

  2. --exclude-dir다음과 같이 필요하지 않다고 알고 있는 일련의 항목을 사용하여 문제 영역을 해결하세요.
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

마지막으로 대규모 재귀 grep을 수행할 때 "권한 거부" 오류가 발생하는 것은 드문 일이 아닙니다. 일반적인 사용 중에는 사용자가 일부 파일을 읽지 못할 수도 있습니다. 이것이 단지 이상한 파일이고 하드 드라이브의 원시 장치나 전체 proc 파일 시스템과 같은 것이 아닌 한 이러한 오류는 무시할 수 있습니다. 실제로 모든 오류를 절대 착륙하지 않도록 명령줄에서 보내면 이 작업을 수행할 수 있습니다.

grep -r search_string /path 2> /dev/null

답변3

단순함을 위해 제안합니다ack-grep. 링크는 ack-grep더 나은 선택인 여러 상황을 보여줍니다.

이를 사용하려면 설치 후 다음을 수행하십시오.

ack-grep pattern /

답변4

.txt특정 이름 패턴(예: 파일)과 일치하는 파일에서만 검색 텍스트를 실행 하려면 다음을 수행할 수 있습니다.

grep -rlw --include="*.txt" -e "text to search" path/to/dir

w검색 텍스트가 파일 콘텐츠의 하위 문자열인 파일도 찾으려면 이 옵션을 무시하세요.

관련 정보