find 및 grep을 사용하여 문자열을 재귀적으로 검색할 때 "권한 거부됨" 오류 메시지를 방지하는 방법은 무엇입니까?

find 및 grep을 사용하여 문자열을 재귀적으로 검색할 때 "권한 거부됨" 오류 메시지를 방지하는 방법은 무엇입니까?

나는 사용한다

find -type f -print0 | xargs -0 -n 10 grep -i searchstring

...재귀적으로 문자열을 검색합니다. 하지만 "권한이 거부되었습니다"와 같은 오류 메시지도 표시되었습니다. 이러한 오류 메시지를 피하고 결과만 볼 수 있는 방법은 무엇입니까?

답변1

표준 오류를 /dev/null로 리디렉션합니다. 즉

find -type f -print0 2>/dev/null | xargs -0 -n 10 grep -i searchstring 2>/dev/null

답변2

오류 메시지가 find에서 나오는 경우(예를 들어 탐색할 수 없는 디렉터리가 있기 때문에 해당 오류를 로 리디렉션합니다 /dev/null.

find -type f -print0 2>/dev/null | …

오류 메시지가 grep에서 나오는 경우(예: 일부 파일을 읽을 수 없기 때문에) 해당 오류를 로 리디렉션 하거나 읽을 수 없는 파일을 무시하도록 지시하는 옵션을 /dev/null전달합니다 .-s

xargs -0 grep -s -i searchstring /dev/null

그러나 항상 최소한 두 개의 파일을 볼 수 있도록 grep추가해야 합니다 . 그렇지 않으면 파일 인수가 하나만 있는 경우 파일 이름이 출력에서 ​​생략됩니다 . GNU grep 또는 Busybox(예: Linux 또는 Cygwin)의 경우 이 옵션을 사용할 수 있습니다 ./dev/nullgrepgrep-H

답변3

액세스 권한이 있는 디렉토리만 검색하고 읽을 수 있는 파일만 확인하려면 GNU find(질문에 사용된 것)를 사용하여 만난 모든 디렉토리에 대한 액세스 및 읽기 권한이 있는지 -executable테스트 할 수 있습니다. -readable디렉터리에 대한 이러한 권한이 없으면 -prune검색 트리에서 경로를 검색할 수 있습니다. 나머지 파일은 모두 테스트되어 -readable읽을 수 있는지 확인됩니다.

이렇게 하면 "권한 거부" 오류가 발생하는 것을 방지할 수 있지만 발생할 수 있는 다른 오류는 숨기지 않습니다.생각하다확인하다:

find . \
    -type d ! \( -readable -executable \) -prune -o \
    -type f -readable -exec grep -F -i searchstring {} +

나는 grep발견된 모든 파일에 대해 유틸리티를 호출하는 것을 피하기 위해 일괄적으로 일반 파일의 경로 이름을 제공합니다. 또한 정규식으로 해석되지 않는 것을 사용하여 쿼리가 수행되었음을 암시하기 위해 -Fwith를 사용합니다.grepsearchstring

관련 정보