rm -rf에 루트 또는 chmod가 없는 디렉토리에 대한 w 권한이 없습니다.

rm -rf에 루트 또는 chmod가 없는 디렉토리에 대한 w 권한이 없습니다.

recursion 을 사용하여 디렉터리를 삭제하려고 하는데 rm -rf일부 내부 디렉터리에 권한이 설정되어 있지 않기 때문에 실패합니다 w. 나는 이 문제를 해결하는 방법을 알고 있습니다 chmod. 그러나 이를 위해서는 전체 디렉터리에 대해 두 번의 반복이 필요하므로 속도가 느려질 수 있습니다.
이러한 디렉토리를 한 번에 삭제할 수 있는 방법이 있습니까? (자신에게 충분한 권한을 부여할 수 있는 충분한 권한이 있다고 가정)
sudo은 옵션이 아닙니다(해당 컴퓨터의 제한된 사용자로서).

답변1

rsync빈 가상 디렉터리를 사용하는 것은 괜찮은 것 같습니다.
mkdir empty; rsync -r --delete empty/ targetdir/; rmdir empty targetdir
10번의 반복 테스트가 포함된 간단한 예에서는 10-14초(14는 이상값, 다른 모든 값은 10~11초 소요)
chmod -R u+w targetdir && rm -rf targetdir19-25초가 소요 됩니다
. find targetdir -type d -exec chmod 755 {} \; && rm -rf targetdir12초~16초 정도 소요되지만 더 복잡한 폴더 구조로 인해 rsync보다 더 악화될 수 있습니다.

답변2

find directory -type d -exec chmod 775 {} \;
rm -rf directory

답변3

성능 측정은 하지 않았습니다. 나는 디렉토리를 읽자마자 모든 파일을 삭제하는 것이 합리적일 것이라고 추측했습니다(어차피 완전히 읽혀지고 페이지 캐시에서 읽은 메타데이터가 손실될 위험이 있기 때문입니다 -depth). 그리고 이러한 권한을 처음에 변경합니다. level 하위 디렉터리를 선택한 다음 필요에 따라 변경합니다. 파일과 하위 디렉터리가 많으면 동일한 디렉터리 내용을 다시 읽는 것을 피하기 어려워 보이며, 파일이 없는 것이 더 빠릅니다.

각 디렉터리에 대해 호출되는 래퍼 스크립트를 사용하는 것이 좋습니다. 이 스크립트는find

  • 매개변수 디렉터리의 모든 파일을 삭제합니다.
  • 필요한 경우 첫 번째 수준 하위 디렉터리에 대한 권한 복구
  • 각 첫 번째 수준 하위 디렉터리에 대한 스크립트 호출
#!/bin/bash
  
set -x

dir_path="$1"

test -d "$dir_path" || exit 1

declare -i tests_x=0
declare -i tests_x_limit=30
while true; do
    # there is a race condition between the -exec + and xargs
    if [ -x "$dir_path" ]; then
        break
    else
        sleep 1
    fi
    tests_x+=1
    if [ "$tests_x" -gt "$tests_x_limit" ]; then
        exit 1
    fi
done

find "$dir_path" -mindepth 1 -maxdepth 1 -type f -delete -o -type l -delete \
-o -\( -type d ! -perm -700 -exec  chmod u=rwx {} + , -print0 \) |
    xargs -0 -n 1 -r "$0"

그리고 그것을 실행

deletion.sh /start/dir

rm -r위의 방법은 디렉터리를 삭제하지 않기 때문에 나중에 수행해야 합니다(IMHO와 같이 유용한(즉, 더 빠른) 방법으로는 디렉터리를 삭제할 수 없습니다 ) rm -r.

명령 방법과 관계없이 파일 시스템 커밋 시간을 늘리는 데 도움이 될 수 있습니다. 그래서 ext4:

mount -o remount,commit=60 /path/to/mp

답변4

각 디렉터리에서 작은 셸을 실행하여 모드를 변경하고 내용을 삭제할 수 있습니다.

find . -depth -type d -exec sh -c 'echo "Removing $1 contents"; chmod +w "$1" ; rm -r "$1"/*' anything {} \;

관련 정보