프로그램은 중첩된 하위 폴더를 많이 생성합니다. 명령을 사용하여 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 dirname
140520개의 파일과 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
있습니다 . 따라서 에서는 다음을 수행할 수 있습니다.rm
autoload zsh/files
zsh
.*
.
..
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
작동하는 동안 디렉토리가 심볼릭 링크로 대체되면 잘못된 디렉토리로 이동할 수 있기 때문입니다.rm
find
고급 최적화:
디렉토리 트리의 최대 깊이를 알고 있는 경우 이를 다음으로 전달할 수 있습니다 find
.
find . -maxdepth 3 -delete
이렇게 하면 find
디렉터리의 내용을 깊이 3까지 읽으려고 시도할 필요가 없습니다.
¹ globskipdots
bash 5.2+의 옵션 도 참조하세요