"find"의 쓰기 가능 및 읽기 가능 테스트를 사용할 수 없을 때 어떻게 표현합니까?

"find"의 쓰기 가능 및 읽기 가능 테스트를 사용할 수 없을 때 어떻게 표현합니까?

때로는 이전 Linux 시스템에서 파일이나 디렉터리의 쓰기/읽기 가능 여부 테스트가 find지원 -writable및 테스트되지 않는 상황 에 직면합니다 . -readable현재 사용자의 경우.

예를 들어 , 사용자에게 쓰기 권한이 있는지 여부를 소유자/그룹별로 테스트하지 않으므로 -writable; 라고 표현하는 것은 동일하지 않습니다.-perm -0002

예를 들어 다른 테스트로 테스트를 어떻게 표현합니까 find?-writablefind-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).findFile::Find그리고-r-w//-x(Perl 프로세스의 유효한 uid 및 gid를 사용하십시오. //를 사용하여 -R실제 uid/gid를 확인하고 사용하십시오.-W-Xaccess(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". 일반 파일 실행 가능성, 디렉토리 쓰기 가능성 또는 대부분의 비전통적 파일에 대한 액세스에 대한 수동 테스트는 없습니다.

관련 정보