`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과 같은 언어 는 access(2). find펄에서는File::Find그리고-r/ -w/-x(Perl 프로세스의 유효 uid 및 gid를 사용합니다. -R// -W를 사용하여 -X실제 uid/gid를 확인 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". 일반 파일의 실행 가능성, 디렉토리 쓰기 가능성 또는 대부분의 비정규 파일에 대한 액세스에 대한 수동 테스트는 없습니다.

관련 정보