Solaris에서 찾기에서 모든 "권한 거부" 메시지를 제외하는 방법

Solaris에서 찾기에서 모든 "권한 거부" 메시지를 제외하는 방법

안녕하세요, 이 주제에 대한 이전 질문에는 Linux에 대한 답변이 포함되어 있지만 Solaris 10에는 포함되어 있지 않습니다.

find . ! -readable -prune

-read가 POSIX가 아니기 때문에 Solaris에서는 작동하지 않습니다.

Solaris에서 찾기에서 모든 "권한 거부" 메시지를 제외하는 POSIX 호환 명령은 무엇입니까?

정답: jlliagre와 random832가 정답을 주었습니다.

답변1

이는 다음을 사용하여 읽을 수 없는 디렉토리를 삭제하는 POSIX 방법입니다 find.

find . \( -exec sh -c ' if [ ! -r "$1" ] ; then { exit 1 ; } ; else for i in "$1"/* ; do if [ -d "$i" -a ! -r "$i" ]; then exit 1; fi; done; fi ' sh {} \; -o -prune \) -a -print

전체 Solaris 설치인 경우 GNU grep은 에서 작동합니다 /usr/sfw/bin/ggrep.

답변2

그냥 필터링하세요.

find . 2>&1 | grep -v "^find: cannot read dir .*: Permission denied$"

답변3

모든 파일에 대해 하위 쉘을 호출하고 싶지 않은 경우 jlliagre의 답변에 대한 이 개선 사항 find은 더 복잡하게 만드는 ACL이 없는 한 조건자를 사용하여 모든 작업을 수행할 수 있습니다. 읽을 수는 있지만 검색할 수 없는 디렉토리를 적절하게 처리하는 것은 연습으로 남겨 둡니다. 이전에 이 내용을 본 적이 없다면 #!"이 모든 내용을 명령줄에 복사하지 말고 대신 그대로 파일에 넣고 chmod +x호출로 사용하십시오 ./nameoffile <directory>." 라는 뜻입니다.

#! /usr/xpg4/bin/sh

PATH=/usr/local/bin:/usr/xpg4/bin:/usr/bin:/bin
export PATH

me="-user $(id -u)"
my_groups="( -group $(id -G | sed 's/ / -o -group /g') )"

prune_me="( ( $me ! -perm -0400 ) -prune )"
prune_group="( ( ! $me $my_groups ! -perm -0040 ) -prune )"
prune_other="( ( ! $me ! $my_groups ! -perm -0004 ) -prune )"

find "$@" $prune_me -o $prune_group -o $prune_other -o -print

관련 정보