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 targetdir
19-25초가 소요 됩니다
. find targetdir -type d -exec chmod 755 {} \; && rm -rf targetdir
12초~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 {} \;