답변:
디렉토리의 inode를 연결 해제하려고 시도 할 수 있지만 고아 파일이 가득 차게 fsck
됩니다 .
rm
얻을만큼 좋은 것입니다.
몇몇 사람들은 어떤 것들이 다른 것들보다 빠른 경우를 언급하고 있습니다. 그러나 동일한 버전의 최고 버전을 비교하고 있는지 확인하십시오.
디렉토리와 그 안의 모든 것을 삭제하려면 다음을 제안합니다.
rm -rf path/to/directory
rm
삭제할 파일과 디렉토리 를 내부적으로 나열합니다. 그리고 그것은 모두 컴파일 된 C 입니다. 이것이 가장 빠른 두 가지 이유입니다.
이것은 매우 날카롭게 같은 것이 아니다 rm -rf path/to/directory/*
되는 확장 쉘 수준과에 인수의 부하를 전달합니다 rm
. 그런 다음 rm
그것들을 구문 분석 한 다음 각각에서 재귀해야합니다. 훨씬 느려요.
비교하는 "벤치 마크"와 마찬가지로 find path/to/directory -exec {} \;
말도 안됩니다. rm
찾은 파일 당 한 번씩 실행됩니다 . 너무 느려. xargs 스타일로 빌드 명령 인수를 찾을 수 -exec rm {} +
있지만 확장만큼 느립니다. 커널에 -delete
대한 내부 unlink
호출을 사용하여 호출 할 수 rm
있지만 (처럼 ) 처음에는 파일에서만 작동합니다.
따라서 디스크를 액체 뜨거운 마그마에 넣지 않는 한 반복하는 rm
것이 왕 입니다.
관련 메모에서, 다른 파일 시스템은 구조 방식으로 인해 다른 속도로 항목을 삭제합니다. 이 작업을 정기적으로 수행하는 경우 이러한 파일을 XFS로 포맷 된 파티션에 저장하여 삭제를 매우 빠르게 처리 할 수 있습니다.
또는 더 빠른 디스크를 사용하십시오. 많은 양의 RAM이 있다면 /dev/shm
(RAM 디스크)를 사용 하는 것이 좋습니다.
unlink
디렉토리 에서 시스템 호출을 사용할 수 없으므로 EISDIR
오류가 발생하므로 첫 번째 옵션을 사용할 수 없습니다.
mv
다른 파일 시스템 / 파티션 사이에이라는 것은 a 다음에을 의미 cp
합니다 rm
.
/tmp
동일한 파일 시스템에 있으면 mv
재시작이 더 빠를 지 궁금합니다 . 어쨌든 /tmp
사용하여 지워 졌는지 확실하지 않습니다 rm
.
때로는 find $DIR_TO_DELETE -type f -delete
보다 빠릅니다 rm -rf
.
시도해 볼 수도 있습니다 mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE
.
당신은 전체 파티션의 내용을 삭제해야하는 경우 마지막으로, 가장 빠른 아마 될 것입니다 umount
, mkfs
그리고 재 mount
.
type -f
파일이 아닌 디렉토리를 의미 하는가? 또한 추가 -print
하면 파일이 삭제 될 때 표시됩니다.
여유 공간이 필요하지 않은 경우 가장 빠른 방법은 삭제를 지연시키고 백그라운드에서 수행하는 것입니다.
그런 다음 조용한 시간에 백그라운드에서 I / O proiority가 낮은 crontab을 사용하십시오.
3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +
노트:
업데이트 : 여러 rm을 병렬로 실행하는 깔끔한 트릭을 발견했습니다. 큰 디스크 배열이있는 경우 도움이됩니다.
ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
깊이 우선 순회를 수행하는 깊이
-maxdepth는 디렉토리 탐색의 깊이를 제한하므로 개별 파일을 수신하지 않습니다.
파일 이름에서 공백을 처리하려면 -d \ n
-P 및 -n은 병렬 처리 수준을 처리합니다 (맨 페이지 확인).
심판 : http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019
업데이트 2 (2018) : Ubuntu 18.04와 함께 제공되는 ZFS에서는 모든 것을 위해 사용하고 모든 큰 프로젝트에 새로운 데이터 세트 를 만들 것 입니다. 미리 계획하고이를 미리 수행하면 파일 시스템을 "zfs destroy"하면됩니다. ;-)
zfsonlinux wiki의 지침을 사용하여 Ubuntu를 ZFS에 기본적으로 설치했습니다. https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. 이 -depth
옵션은 find
먼저 자녀를 나열하도록 지시 합니다.
문제는 링크 해제를 이해하고 FSCK에 파일이 누락되었다고 생각하는 진정한 색인화 된 파일 시스템없이 매우 큰 디렉토리와 전체 내용 세트를 제거하는 완벽한 방법이 없다는 것입니다. 신뢰가 있어야합니다.
예를 들어 골프 범위에 대해 zoneminder를 실행하고 있습니다. 나는 그녀가 120GB 드라이브에서 어떻게 실행했는지를 하루에 캡처하는 엄청난 양의 데이터 (12 개의 카메라 피드)를 처리하기 위해 1.5TB의 Linux 레이드를 구성했습니다. 간단히 말해 캡처 된 모든 데이터의 폴더는 약 1.4TB의 스토리지입니다. 제거 할 로트
ZM을 다시 설치하고 1.4TB 이전 라이브러리를 제거하는 것은 이전 이미지를 삭제하는 데 1-2 일이 걸릴 수 있으므로 재미 있지 않습니다.
인덱스 된 실제 FS는 디렉토리의 삭제를 허용하고 그 아래의 데이터가 죽었고 데이터를 제로화하는 것은 시간과 PC 자원을 낭비한다는 것을 알고 있습니다. 삭제 된 데이터를 제로화하는 옵션이어야합니다. RM은 ext4에서 현실 세계에서 오래 걸리는 것입니다.
답변 : 모든 파일을 반복적으로 연결 해제하면 속도가 약간 빨라지지만 FSCK를 실행하려면 시간을 따로 설정해야합니다.
재귀 "FOR"명령을 실행하여 폴더 아래의 모든 파일을 "링크 해제"한 다음 모든 폴더를 rm 또는 rmdir로 정리하여 정리할 수있는 스크립트를 작성하십시오. 편리 할 때 나머지 데이터를 제로화하기 위해 FSCK를 수동으로 실행하십시오. 킨디 게으른 미안 해요 :).
기존 디렉토리를 제거하려는 경우 유용하지는 않지만 정기적으로 제거해야하는 파일이 많은 디렉토리가있는 경우 가능한 전략은 디렉토리를 자체 파일 시스템에 두는 것입니다 ( 예를 들어 , 파티션). 그런 다음 제거해야 할 때 마운트를 해제하고을 실행 한 mkfs
후 다시 마운트하십시오. 예를 들어, OpenBSD/usr/obj
는 시스템을 빌드하는 동안 많은 파일이 생성되고 다음 빌드 전에 삭제해야하는 경우이 작업을 수행하도록 권장합니다 .