특정 액세스 거부 경로를 무시하면서 모든 로그 파일을 재귀적으로 찾는 방법은 무엇입니까?

특정 액세스 거부 경로를 무시하면서 모든 로그 파일을 재귀적으로 찾는 방법은 무엇입니까?

저는 Linux Mint 18.3을 사용하고 있으며 오류 메시지 없이 Linux 시스템의 모든 로그 파일을 찾으라는 학교 과제가 있습니다. 명령을 모아서 철저하게 설명해야 합니다. find를 사용하여 방법을 찾은 것 같지만 gvfs에 대한 액세스 거부 메시지가 있어 어떻게 처리해야 할지 모르겠습니다. 오류 메시지를 맹목적으로 필터링할 뿐만 아니라 실제로 말이 되지 않는 메시지만 무시하는 간단하면서도 스마트한 명령을 작성하는 데 도움을 주실 수 있나요? 내 첫 번째 시도:

# find / -type f -name '*.log'

모든 로그 파일이 반환된 것으로 보이지만 결과는 다음과 같습니다.

find: '/run/user/1000/gvfs': Permission denied

그런 다음 폴더를 생략해 보았습니다.

# find / -type d \( -name run \) -prune -o -type f -name '*.log' -print

그러나 전체 실행 폴더를 무시하는 것은 현명하지 않은 것 같으므로 지정을 시작하고 특정 경로로 범위를 좁힐 수도 있습니다. 확립된이것게시물 및unix.stackexchange.com/a/77592대답하고 이 특정 경로를 생략하려고 했습니다.

# find / -name '*.log' -path '/run/user/1000/gvfs' -prune -o -type f -name '*.log' -print

하지만 예상대로 작동하지 않는 것 같습니다. 모든 로그 파일에서 반환값은 여전히 ​​동일한 것 같습니다.

find: '/run/user/1000/gvfs': Permission denied

이제 이해하는 데 어려움이 있거나 내 생각이 잘못되었거나 가장 쉽고 현명한 방법인 이 특정 경로를 무시하고 있습니다.

답변1

로그 파일은 에 저장되므로 실제로 전체 루트 디렉터리에서 실행할 /var/log필요는 없습니다 . find이 작업을 고집하고 오류를 피하기 위해 디렉터리를 제외하려면 구문은 다음과 같아야 합니다.

find / -wholename /run -prune -o -type f -name '*.log' -print

이 디렉터리는 FUSE의 마운트 지점이고 로그 파일을 포함하지 않으며 /run그 자체가 권한 오류가 발생하는 디렉터리(적어도 Centos, Fedora 및 RHEL에서는)이므로 위 명령은 해당 디렉터리를 완전히 제외합니다. 저는 Mint를 설치하지 않았으므로 오류가 발생할 때까지 아래쪽을 자르도록 명령을 편집할 수 있습니다.

또한 명심해야 할 한 가지는 로그 파일이 항상 , , 등 .log으로 끝나는 것은 아니라는 것입니다 .messagesdmesgcronsecure

답변2

그냥 해:

 find / -type f -name '*.log' 2>/dev/null

또는

find /var -type f -name '*.log'

로그에 관한 한var

답변3

"권한 거부" 오류 메시지를 방지하기 위한 올바른 관용구는 다음과 같습니다.

find <root-path> ! -readable -prune -o <rest of your find arguments>

이를 원래 과제 답변에 적용하면 다음과 같은 결과가 발생합니다.

find / ! -readable -prune -o -type f -name "*.log"

이는 "간단하고 스마트한 명령 조립"에 대한 요구 사항을 충족해야 합니다. 또한 읽을 수 없는 콘텐츠만 필터링하므로 "맹목적으로 오류 메시지를 필터링하지 않음"이라는 요구 사항을 충족합니다. "하지만 실제로 말이 안되는 것만 남겨두세요"라는 마지막 요청은 완전히 다른 문제이며 On에서 "스크립트가 기본 syslog 루트를 찾도록 하는 방법이 있습니까?"라는 별도의 좋은 질문을 제기합니다. 스크립트를 실행하는 특정 시스템? 어떤 환경 변수가 있는지 모르겠습니다.

관련 정보