디렉터리의 모든 파일과 하위 폴더를 삭제하는 가장 빠른 방법은 무엇입니까? [복사]

디렉터리의 모든 파일과 하위 폴더를 삭제하는 가장 빠른 방법은 무엇입니까? [복사]

프로그램은 중첩된 하위 폴더를 많이 생성합니다. 명령을 사용하여 rm -fr *모두 삭제해 보았습니다 . 하지만 매우 느립니다. 더 빠르게 제거할 수 있는 방법이 있는지 궁금합니다.

답변1

해당 디렉터리에서 제거하는 가장 빠른 방법은 해당 디렉터리에서 제거한 다음 백그라운드에서 삭제하는 것입니다.

mkdir ../.tmp_to_remove
mv -- * ../.tmp_to_remove
rm -rf ../.tmp_to_remove &

이는 현재 디렉터리가 마운트된 일부 파티션의 최상위 수준(즉, ../.tmp_to_remove동일한 파일 시스템)에 있지 않다고 가정합니다.

에 대해 궁금한 점이 있으시면 --.mv-

위의 코드는 하위 디렉터리를 반복적으로 처리할 필요가 없기 때문에 1초 이내에 현재 디렉터리에서 파일을 삭제합니다. 실제로 파일 시스템에서 트리를 제거하는 데 시간이 더 걸리지만 방해가 되지 않기 때문에 실제 효율성은 그다지 중요하지 않습니다.

답변2

rsync놀라울 정도로 빠르고 쉽습니다. 먼저 빈 디렉터리를 만들어야 합니다.

mkdir 빈 디렉토리
rsync -a --빈 디렉토리/디렉토리/삭제

yourdirectory/파일을 삭제하려는 디렉토리입니다.

답변3

가장 빠른 것은 rm -rf dirname140520개의 파일과 9699개의 디렉터리를 포함하는 RedHat6.4에서 ext3 파일 시스템의 스냅샷 마운트 지점을 사용했습니다. 속도가 느리다 면 rm -rf *아마도 최상위 디렉토리 항목에 다음이 있기 때문일 것입니다.위치파일이 있고 쉘이 확장 중이므로 *추가 readdir 및 정렬이 필요합니다. 디렉토리로 변경하고 실행합니다 rm -rf dirname/.

Method                    Real time    Sys time  Variance (+/-)
find dir -delete          0m8.108s     0m3.668s  0.055s
rm -rf dir                0m7.956s     0m3.640s  0.081s
rsync -delete empty/ dir/ 0m8.305s     0m3.918s  0.029s

노트:

  • rsync 버전: 3.0.6
  • rm/coreutils 버전: 8.4-19
  • 찾기/findutils 버전: 4.4.2-6

답변4

의 한 가지 문제 rm -rf *또는 더 정확한 문제 rm -rf -- *는 셸이 먼저 현재 디렉토리에 있는 모든(숨겨지지 않은) 파일을 나열하고 이를 정렬하여 에 전달한다는 것입니다 rm. 이는 현재 디렉토리에 있는 파일 목록이 크면 증가합니다. 불필요하고 추가 오버헤드가 발생하며 파일 목록이 너무 크면 실패할 수도 있습니다.

일반적으로 이 작업을 수행합니다 rm -rf .(숨겨진 파일을 제거하는 이점도 있음). 그러나 대부분의 rm구현(모든 POSIX 호환 구현 포함)은 이를 거부합니다. 그 이유는 일부 쉘(모든 POSIX 쉘 포함)에 glob 확장에 및 가 .*포함되는 잘못된 기능이 있기 때문입니다 . 이는 현재 디렉토리와 상위 디렉토리가 삭제됨 을 의미하므로 이러한 쉘의 잘못된 기능을 해결하기 위해 수정되었습니다....rm -rf .*rm

일부 쉘 pdksh(및 기타 Forsyth 쉘 파생물)에는 zsh이러한 fish잘못된 기능이 없습니다. 에 포함 되거나 사용되지 않으므로 활성화할 수 있는 내장 기능이 zsh있습니다 . 따라서 에서는 다음을 수행할 수 있습니다.rmautoload zsh/fileszsh.*...rm -rf .zsh

zmodload zsh/files
rm -rf .

Linux에서는 다음을 수행할 수 있습니다.

rm -rf /proc/self/cwd/

현재 디렉토리를 지우거나 다음을 수행하십시오.

rm -rf /dev/fd/3/ 3< some/dir

모든 디렉터리를 지웁니다.

(다음 내용에 주목하세요 /)

GNU 시스템에서는 다음을 수행할 수 있습니다.

find . -delete

이제 현재 디렉터리에 몇 개의 항목만 있고 대부분의 파일이 하위 디렉터리에 있는 경우 이는 큰 차이를 만들지 않으며 rm -rf -- *아마도 얻을 수 있는 가장 빠른 속도일 것입니다. 이는 모든 디렉터리의 내용을 읽고 각 항목을 rm -rf호출하는 것을 의미하므로 각 파일에서 무엇이든 제거하는 것은 비용이 많이 들 것으로 예상됩니다 . 삭제된 파일의 inode, 파일이 포함된 디렉터리, 일부 파일 시스템 매핑 또는 기타 사용 가능한 영역을 수정해야 하기 때문에 그 자체로 비용이 매우 많이 들 수 있습니다.unlink()unlink()

rm그리고 find(적어도 GNU 구현에서는) 이미 각 디렉토리의 inode 번호를 기준으로 파일 목록을 정렬하고 있습니다. 이는 수정되는 연속(또는 서로 가까운) inode의 수를 줄여주기 때문에 ext4 파일 시스템의 성능에 큰 차이를 만들 수 있습니다. 순차적으로.

rsync파일을 이름별로 정렬합니다. 이름 순서가 inum 순서와 일치하지 않는 한(정렬된 파일 이름 목록에서 파일이 생성되는 경우와 같이) 성능이 크게 저하될 수 있습니다.

어떤 경우에는 더 빠를 수 있는 이유 중 하나는 경쟁 조건을 피하기 위한 안전 예방 조치를 취하지 않는 것 같아서 rsync작동하는 동안 디렉토리가 심볼릭 링크로 대체되면 잘못된 디렉토리로 이동할 수 있기 때문입니다.rmfind

고급 최적화:

디렉토리 트리의 최대 깊이를 알고 있는 경우 이를 다음으로 전달할 수 있습니다 find.

find . -maxdepth 3 -delete

이렇게 하면 find디렉터리의 내용을 깊이 3까지 읽으려고 시도할 필요가 없습니다.


¹ globskipdotsbash 5.2+의 옵션 도 참조하세요

관련 정보