grep 도구를 사용해야한다고 가정하면 전체 파일 시스템에서 텍스트 문자열 “800×600″을 검색하고 싶습니다.
나는 시도했다 :
grep -r 800x600 /
그러나 작동하지 않습니다.
내 명령은 텍스트 “800×600″에 대한 루트 아래의 모든 파일 / 폴더를 통해 재귀 적으로 grep하고 검색 결과를 나열해야한다고 생각합니다.
내가 무엇을 잘못하고 있지?
답변
나는 보통이 스타일의 명령을 사용 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 -2M
2MB보다 작은 파일을 의미합니다. -mtime -5
지난 5 일 동안 수정 된 파일을 의미합니다. 이들을 -a for 및 -o for or 와 함께 결합하고 '('
괄호 ')'
를 사용 하여 표현식을 그룹화하십시오 (쉘이 해석하지 못하도록 따옴표로 묶음 ). 예를 들어 :
find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"
man find
가능한 필터의 전체 목록을 살펴보십시오 .
답변
일반적으로 시스템에서 모든 것을 실제로 검색하고 싶지는 않습니다. 리눅스는 모든 것을 위해 파일 노드를 사용하므로, 일부 “파일”은 검색하고자하는 것이 아닙니다. 예를 들어 /dev/sda
첫 번째 하드 드라이브의 물리적 블록 장치입니다. 원시 디스크 장치가 아닌 마운트 된 파일 시스템을 검색하려고합니다. 또한 /dev/random
읽을 때마다 임의의 데이터가 추출됩니다. 이해가되지 않는 검색. /proc
파일 시스템은 귀하의 경우 문제가있다.
두 가지 중 하나를 추천합니다.
-
루트에서 검색하지 말고 유용한 장소 만 검색하십시오. 검색
/home
하거나/usr
또는/etc
separatly. 찾고있는 정보는 특정 유형 일 가능성이 있으므로 어쨌든 특정 폴더에있을 수 있습니다. 구성 설정은에 있어야합니다/etc
. 개인 데이터 파일은에 있어야합니다/home
. 이와 같은 주요 영역으로 검색을 제한하면 재귀 그렙 문제를 크게 줄일 수 있습니다. -
사용
--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
답변
간단히하기 위해 ack-grep을 제안 합니다. ack-grep
더 나은 옵션 인 경우 링크는 많은 경우를 보여줍니다 .
설치 후 사용하는 방법은 다음과 같습니다.
ack-grep pattern /
답변
그것을 보는 또 다른 방법은 다음과 같습니다.
grep -r /* | grep "800x600"
답변
* / proc / sysrq-trigger : 입 / 출력 오류가 발생합니다
명령이 작동 중입니다. 실행중인 프로세스에서 문자열을 스캔하려고하므로이 오류가 발생합니다.
시스템 디렉토리를 제외하는 것이 좋습니다
grep -exclude-dir = {proc, sys} “800×600″/
답변
간단하게
grep -r "800x600" /
-현재 명령에서 잘못된 것은 따옴표 “”입니다. 항상 문자열 인수를 grep
따옴표로 묶으십시오.