find
검색에서 하위 디렉토리를 제외하고 디렉토리의 내용을 나열하기 위해 Solaris 10에서 사용하려고 합니다 . 나는 다음을 기반으로 명령을 시도했습니다.sdaau가 제안한 솔루션:
find /tmp -type d ! -perm -u+rx -prune -o -type f -name dsm\*
안타깝게도 원하는 결과를 반환하는 것 외에도 여전히 다음과 같은 오류가 발생합니다.
find: cannot read dir /tmp/hsperfdata_oracle4: Permission denied
find: cannot read dir /tmp/hsperfdata_jsweb: Permission denied
/tmp에는 실행 사용자에게 find
읽기 권한이나 통과(실행) 권한이 없는 여러 디렉터리가 있습니다.
-bash-3.2$ ls -ld /tmp/hsp*
drwxr-x--- 2 jsweb other 117 Jan 5 13:00 /tmp/hsperfdata_jsweb
drwxr-x--- 2 oracle4 dba4 117 Nov 5 19:51 /tmp/hsperfdata_oracle4
drwxr-xr-x 2 root root 117 Jan 22 08:58 /tmp/hsperfdata_root
find
0이 아닌 반환 코드로 끝나지 않도록 이러한 오류를 제거하는 방법을 찾아야 합니다 . 내가 무엇을 간과하고 있습니까?
답변1
이러한 오류를 삭제하고 종료 상태를 무시할 수 있습니다.
find /tmp -name dsm\* -type f 2> /dev/null || :
여전히 stderr을 유지하고 find
액세스 제한으로 인해 디렉터리를 입력하거나 나열할 수 없는 것 이외의 오류를 볼 수 있는 경우 이러한 권한 문제를 감지하는 구문을 사용해 볼 수 있지만 이는 까다로울 수 있습니다.
액세스 권한이 없는 디렉터리는 권한과 소유권(사용자 및 그룹)에 따라 달라집니다. 다음과 같은 것이 필요합니다.
export "PATH=$(getconf PATH):$PATH"
u=$(id -u) g=$(id -G | sed 's/ / -o -group /g'); IFS=" "
find /tmp -type d ! \( \
-user "$u" -perm -u=rx -o \
! -user "$u" \( -group $g \) -perm -g=rx -o \
! -user "$u" ! \( -group $g \) -perm -o=rx \
\) -prune -o -type f -name dsm\* -print
제가 테스트한 결과, Solaris 11에서는 find
디렉토리를 정리하더라도 여전히 디렉토리를 읽을 수 없다고 불평할 것이며, Solaris 10에서는 아무것도 할 수 없습니다. 혼자 -prune
그들에게 말해보세요 .
그래서 솔라리스는 find
이 점에 있어서는 희망이 없어 보입니다. 대신 perl
의 모듈을 사용할 수 있습니다 File::Find
.
또한 위의 접근 방식은 ACL이나 기타 보안 제한 사항이 아닌 단순한 Unix 권한만 고려한다는 점에 유의하세요.
답변2
귀하의 예에서는 ! -perm -u+rx
이는 사실로 평가되지 않습니다. 소유자는 여전히 권리를 갖습니다. ! -perm -o+rx
따라서 다음을 사용해야 합니다 .
find /tmp -type d ! -perm -o+rx -prune -o -type f -name dsm\*
답변3
무엇을 달성하고 싶은지 확실하지 않지만 하위 디렉터리가 필요하지 않으므로 a를 실행 ls
하고 파이프로 연결하면 어떨까요 grep
? 어쩌면 당신이 사용하거나 당신의 필요를 충족시킬 수 awk
있습니까 sort
?
답변4
find /tmp -type d ! -perm -775 -prune -o -type f -name dsm\*