사용자 권한 없이 모든 파일 삭제

사용자 권한 없이 모든 파일 삭제

소유자(u)가 한 명령으로 삭제할 수 r없는 디렉터리의 모든 파일을 삭제하라는 메시지가 표시됩니다 w.x

나는 다음 명령을 시도했습니다.

find data -type f ! -perm -u=rwx -exec rm -f {} \;

...하지만 너무 많은 파일이 삭제되는 것 같아요.

답변1

생각하다GNU를 독점적으로 사용 한다고 가정하면 다음을 원합니다 find.

find -type f \! -perm /u=rwx -exec echo rm -f {} \;

테스트를 위해 하나를 추가했습니다 echo.

인쇄된 문서가 기대에 부응하는 경우 해당 문서를 제거하십시오. :)

답변2

Linux 시스템을 사용하는 경우 GNU가 있을 가능성이 높으며 find다른 답변의 예를 따르고 find data -type f ! -perm /u=rwx -delete.

findLinux 시스템을 사용하지 않는 경우 조건자 매개변수의 비표준 구문을 이해하지 못하는 BSD 시스템(예: macOS 또는 오픈 소스 BSD 중 하나)을 사용하고 있을 가능성이 높습니다 . 이 경우 각 파일에서 를 사용하여 기호화된 사용자 권한을 선택하고 문자열에 대해 테스트할 수 있습니다(즉, 사용자에게 파일에 대한 권한이 없음을 의미)./u-permstat---

find data -type f -exec sh -c '[ "$(stat -f %SHp "$1")" = --- ]' sh {} \; -print

이는 statLinux가 아닌 BSD를 가정합니다 stat. 이 옵션은 출력을 -f %SHp해당 파일의 stat"높은"( H사용자 비트) 표기법( S) 권한 비트( ) 로 형식화합니다. p일반적인 Linux에 해당하는 방법 stat은 셸 패턴을 사용한 -c %f다음 ?0??이를 셸 패턴과 일치시키는 것입니다.

실제로 파일을 삭제 -print하도록 변경할 수 있습니다 .-delete

각 파일에 대해 새 셸을 시작하지 않는 약간 더 효율적인 변형:

find data -type f -exec sh -c '
    for pathname do
        [ "$(stat -f %SHp "$pathname")" = --- ] && echo rm "$pathname"
    done' sh {} +

삭제는 echo파일을 삭제합니다.

답변3

면책조항: 저는 이 책의 현재 저자입니다.생가죽(오른쪽 회전) (바라보다https://github.com/raforg/rawhide)

그리고생가죽(오른쪽 회전) 넌 할 수있어:

rh -UUU data 'f && !ur && !uw && !ux'

-UUU일치 항목을 연결 해제/삭제/제거합니다.

data검색 경로입니다.

남은 것은 검색 기준뿐입니다.

f즉, 일반 파일이라는 뜻입니다.

!ur소유자가 읽을 수 있는 권한 비트가 설정되지 않았음을 나타냅니다.

!uw소유자 쓰기 가능 권한 비트가 설정되지 않았음을 나타냅니다.

!ux소유자 실행 권한 비트가 설정되지 않았음을 의미합니다.

마지막 세 가지 작업은 더 간결하게 수행할 수 있습니다 none(0700).

rh -UUU data 'f && none(0700)'

물론, 사용자가 일치하는 파일이 포함된 디렉터리에 대한 쓰기 권한을 가지고 있는 경우에만 일치하는 항목을 삭제할 수 있습니다. 이것이 문제인 경우 sudo를 통합해야 할 수도 있습니다.

    rh -x 'sudo rm %s' data 'f && !ur && !uw && !ux'

-x ...일치할 때마다 주어진 쉘 명령을 실행합니다.

%s일치하는 파일 경로(예: find {})로 대체됩니다.

하지만액세스 제어 목록이 있는 경우에는 이 방법이 작동하지 않습니다.

ACL이 존재하고 확인 중인 모든 파일의 소유자가 현재 사용자인 경우 access(2)시스템 호출을 사용하여 액세스 권한을 적절하게 확인할 수 있습니다.

GNU find실제 접근 확인을 수행하는 , , 가 있고 -readable이를 위한 , , 가 있습니다 .-writable-executablerhiriwix

rh -UUU data 'f && !ir && !iw && !ix'

그러나 이는 현재 사용자가 모든 관련 파일의 소유자인 경우에만 작동합니다. 파일에 ACL과 다른 소유자가 있을 수 있는 경우 이 access(2)접근 방식은 도움이 되지 않습니다. 그러니 이런 일이 당신에게 일어나지 않기를 바랍니다.

답변4

그리고 zsh:

rm -- data/**/*(D.^rwx)

관련 정보