때로는 이전 Linux 시스템에서 파일이나 디렉터리의 쓰기/읽기 가능 여부 테스트가 find
지원 -writable
및 테스트되지 않는 상황 에 직면합니다 . -readable
현재 사용자의 경우.
예를 들어 , 사용자에게 쓰기 권한이 있는지 여부를 소유자/그룹별로 테스트하지 않으므로 -writable
; 라고 표현하는 것은 동일하지 않습니다.-perm -0002
예를 들어 다른 테스트로 테스트를 어떻게 표현합니까 find
?-writable
find
-perm
답변1
편리한 방법이 없습니다. 이것이 GNU가 추가 기능 -readable
과 친구를 찾는 이유입니다.
사용자가 구성원으로 속한 그룹을 열거하여 권한 테스트와 유사한 표현식을 작성할 수 있습니다. 검증되지 않은.
can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print
-rw----r--
예를 들어 액세스 제어 목록이 존재하는 경우나 그룹에 대한 액세스 거부 와 같은 극단적인 경우에는 올바른 결과가 제공되지 않는 경우도 있습니다 . 위와 동일한 기술을 사용하여 극단적인 경우를 확인할 수 있지만 표현식이 더 복잡해집니다. 액세스 제어 목록의 경우 이를 지원하는 도구를 호출해야 합니다.
Perl 및 Python과 같은 언어는 Perl에서 다음과 같은 쉬운 액세스를 제공합니다 access(2)
.find
File::Find
그리고-r
-w
//-x
(Perl 프로세스의 유효한 uid 및 gid를 사용하십시오. //를 사용하여 -R
실제 uid/gid를 확인하고 사용하십시오.-W
-X
access(2)
filetest 'access'
기타 참고 사항Perl이 ACL과 같은 기능을 지원하기에 너무 오래되지 않은 경우):
use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');
파이썬에서는 다음을 사용합니다.os.walk
그리고os.access
(예를 들어 Python 프로세스의 실제 uid 및 gid를 사용합니다 access(2)
.)
import os
for dirpath, dirnames, filenames in os.walk('.', ):
for filename in filenames:
filename = os.path.join(dirpath, filenames)
if os.access(filename, os.R_OK):
print(filename + ' is readable\n')
완전히 신뢰할 수 있는 유일한 방법은 파일을 열어보는 것입니다. 이를 위해서는 외부 유틸리티가 필요하므로 속도가 느려집니다. 일반 파일의 가독성을 테스트하려면:
find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …
쓰기 가능성을 테스트하려면 다음을 사용하세요 : >>"$0"
(이렇게 하면 추가할 파일이 열리므로 파일을 쓸 수 없으면 실패하지만 실제로 아무것도 수정하지 않으며 특히 수정 시간을 업데이트하지 않습니다). 디렉토리의 가독성을 테스트하려면 를 사용하십시오 ls -- "$0" >/dev/null
. 디렉토리의 실행 가능성을 테스트하려면 를 사용하십시오 cd -- "$0"
. 일반 파일 실행 가능성, 디렉토리 쓰기 가능성 또는 대부분의 비전통적 파일에 대한 액세스에 대한 수동 테스트는 없습니다.