rm -rf .*를 사용하여 하위 디렉터리를 삭제하려고 했지만 하위 폴더 삭제에 실패했습니다. 최대 5000개까지 처리할 수 있지만 10000개 이상의 하위 디렉터리를 한 번에 삭제할 수 없습니다. 하위 디렉터리에서 파일을 삭제한 다음 하위 디렉터리를 삭제하는 스크립트를 작성했습니다.
# loop & print a folder recusively,
print_folder_recurse() {
for i in "$1"/*;do
if [ -d "$i" ];then
print_folder_recurse "$i"
#echo "dir: $i"
elif [ -f "$i" ]; then
#echo "file: $i"
rm -rf $i
fi
done
#echo "dir: $1"
if [[ "$1" != "$path" ]]; then
#echo "dir : $1"
rm -rf $1o
fi
}
참고: 이 스크립트도 가끔 실패합니다. 디렉터리 크기가 항상 20GB로 제한되지는 않습니다. 앞으로 훨씬 더 커질 수 있습니다.
이런 종류의 문제를 처리하는 더 나은 방법을 알고 있는 Linux 전문가가 있습니까?
답변1
문제는 삭제할 항목의 크기가 아니라 수량입니다.
:을 시도하든 rm -rf *
스크립트에서든 for i in "$1"/*;do
:shell에는 수천 개의 파일 경로를 찾아 메모리에 저장하는 확장*이 필요합니다. 숫자가 너무 크면 속도가 매우 느려지거나 실패합니다(오류 메시지와 함께).
단순화하여 스크립트에서 직접 사용해야 합니다 rm -rf "${1:-missing_directory_name}"
. 유일한 명령으로: rm은 서브파일 검색을 자체적으로 처리합니다.
대안은 find "${1:-missing_directory_name}" - type f -depth -print0 | xargs -0 -n 100 rm
exat 파일 수에 관계없이 find가 100개의 파일 이름을 출력할 때마다 rm을 호출하여 rm에 추가되는 인수 수를 제한하는 것입니다. 그런 다음 find "${1:-missing_directory_name}" -type f -depth -print0 | xargs -n 100 rmdir
비어 있지 않은 디렉토리를 먼저 삭제하지 않으려면 "가장 깊은 디렉토리"부터 시작하여 나머지 디렉토리에 대해 rmdir 과 같은 다른 조회를 수행하십시오 . (그러나 첫 번째 솔루션은 이 모든 것을 1rm으로 수행하며 궁극적으로 가장 효율적인 것으로 입증될 수 있습니다)
스크립트가 실행되는 동안 다른 터미널 창에서 다음을 수행할 수 df -i directory_name
있으며 디렉터리의 파일이 삭제됨에 따라 inode 수가 급격히 감소하는 것을 확인할 수 있습니다. (df -i는 디렉토리_이름을 포함하는 파일 시스템에 대한 모든 inode를 표시하므로 해당 파일 시스템의 다른 파일이 다른 디렉토리나 상위 디렉토리에 있을 수 있으므로 0으로 끝나지 않을 수 있습니다.
다른 방법도 많이 있습니다(최근 조사 결과에 따르면 xargs 등을 사용하지 않는 다른 방법도 있습니다).
아이디어는 동일하게 유지됩니다. 확장할 파일 수가 너무 많으면 쉘 확장을 사용하지 마십시오.