많은 파일이 포함된 디렉터리에서 실행하면 rm -rf /some/folder/*
서버 성능이 크게 저하됩니다 . 드라이브는 프리미엄 SSD입니다.
파일을 삭제하는 다양한 방법을 시도했습니다: find --delete
, rsync
(설명여기). 도움이 안돼.
내 경험에 따르면 이는 Azure 문제입니다.
"느리다"는 것은 2분 30초 안에 116,000개의 파일이 처리된다는 의미입니다. 로컬에서는 1초가 걸립니다. 다른 서버 제공업체도 1~3초 정도 소요됩니다.
서버의 전반적인 성능에 영향을 주지 않고 많은 파일을 빠르게 삭제할 수 있는 방법이 있습니까?
답변1
서버의 전반적인 성능에 영향을 주지 않고 많은 파일을 빠르게 삭제할 수 있는 방법이 있습니까?
당신은 속일 수 있습니다. 불행하게도 그것은 문제를 해결하지 못하고 단지 밀어낼 뿐입니다. 반면에 이는 유용한 해결 방법이 될 수 있습니다.
바꾸다
rm -rf /some/folder/*
사용
items=(/some/folder/*) # List of items to delete
prefix=".DELETE_ME.$$"
for item in "${items[@]}"
do
x="$${item%/*}/.$prefix.${item##*/}" # New temporary path for item to delete
mv -f "$item" "$x" || rm -rf "$item" # Rename or delete
done
for item in "${items[@]}"
do
x="$${item%/*}/.$prefix.${item##*/}"
rm -rf "$x" # Delete whatever is left
done >/dev/null 2>&1 & # Run sequentially in background
이를 스크립트(파싱된 매개변수 사용 for item in "$@"
) 또는 쉘 함수로 래핑할 수 있습니다.
나는 여러 번의 삭제를 동시에 수행하여 서버 성능을 저하시키지 않도록 더 분명한 "백그라운드에서 이름 바꾸기 및 삭제" 대신 두 개의 루프를 사용했습니다. 효과를 예방할 수는 없지만 제거 속도를 높이는 데 도움이 될 수 있습니다.
답변2
내 생각에 당신이 가질 수 있는 문제는 디렉토리에서 116000개의 파일을 삭제하려고 한다는 것입니다. 디렉터리에서 n개의 파일을 삭제하려면 n번이 필요합니다. 그리고 그것은 매우 느릴 것입니다. 심지어 곤경에 ls -l
빠지기 도 합니다 find
. 직선은 /bin/ls
모든 파일에 액세스할 필요가 없기 때문에 여전히 매우 빠릅니다.
비결은 애초에 한 디렉토리에 그렇게 많은 파일을 저장하지 않는다는 것입니다. 대신 여러 디렉터리 수준을 만듭니다.
실패하면 삭제될 때까지 잠시 기다려야 합니다.
답변3
당신은 그것을 사용할 수 있습니다 -exec rm -rf {} \;
:
find /some/dir/ -type f -exec rm -rf {} \;
이 명령은 디렉토리의 모든 파일을 삭제합니다/some/dir