"rm -rf"보다 디렉토리를 제거하는 더 빠른 방법이 있습니까?


32

파일이 많은 폴더가 있고 "rm -rf"를 완료하는 데 많은 시간이 걸립니다. 디렉토리와 디렉토리의 내용 (하위 디렉토리 등)을 제거하는 더 빠른 방법이 있습니까?


아무도 관심을 참조하십시오 : slashroot.in/comment/1286#comment-1286 찾을 으뜸 펄 으뜸 rsync를
Rinzwind

답변:


33

디렉토리의 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오류가 발생하므로 첫 번째 옵션을 사용할 수 없습니다.
James Henstridge

mv에서 / tmp로 더 빠를까요? mv도 많은 시간이 걸리는 것 같습니다.
Mohammad Moghimi

@MohammadMoghimi : mv다른 파일 시스템 / 파티션 사이에이라는 것은 a 다음에을 의미 cp합니다 rm.
enzotib

3
@enzotib 그러나 /tmp동일한 파일 시스템에 있으면 mv재시작이 더 빠를 지 궁금합니다 . 어쨌든 /tmp사용하여 지워 졌는지 확실하지 않습니다 rm.
Sparhawk

1
rsync이 벤치 마크의 경우보다 더 빨리이다 rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/...
schmijos

11

때로는 find $DIR_TO_DELETE -type f -delete보다 빠릅니다 rm -rf.

시도해 볼 수도 있습니다 mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

당신은 전체 파티션의 내용을 삭제해야하는 경우 마지막으로, 가장 빠른 아마 될 것입니다 umount, mkfs그리고 재 mount.


1
되지 않은 type -f파일이 아닌 디렉토리를 의미 하는가? 또한 추가 -print하면 파일이 삭제 될 때 표시됩니다.
leetbacoon

8

여유 공간이 필요하지 않은 경우 가장 빠른 방법은 삭제를 지연시키고 백그라운드에서 수행하는 것입니다.

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone .delete_me

그런 다음 조용한 시간에 백그라운드에서 I / O proiority가 낮은 crontab을 사용하십시오.

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

노트:

  • crontab에서 에코를 제거하기 전에 출력을 확인하십시오!
  • .delete_me 디렉토리는 모두에게 분명하지 않은 경우 동일한 파일 시스템에 있어야합니다.

업데이트 : 여러 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


2
마지막 명령 대신을 사용하십시오 find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. 이 -depth옵션은 find먼저 자녀를 나열하도록 지시 합니다.
muru

2

문제는 링크 해제를 이해하고 FSCK에 파일이 누락되었다고 생각하는 진정한 색인화 된 파일 시스템없이 매우 큰 디렉토리와 전체 내용 세트를 제거하는 완벽한 방법이 없다는 것입니다. 신뢰가 있어야합니다.

예를 들어 골프 범위에 대해 zoneminder를 실행하고 있습니다. 나는 그녀가 120GB 드라이브에서 어떻게 실행했는지를 하루에 캡처하는 엄청난 양의 데이터 (12 개의 카메라 피드)를 처리하기 위해 1.5TB의 Linux 레이드를 구성했습니다. 간단히 말해 캡처 된 모든 데이터의 폴더는 약 1.4TB의 스토리지입니다. 제거 할 로트

ZM을 다시 설치하고 1.4TB 이전 라이브러리를 제거하는 것은 이전 이미지를 삭제하는 데 1-2 일이 걸릴 수 있으므로 재미 있지 않습니다.

인덱스 된 실제 FS는 디렉토리의 삭제를 허용하고 그 아래의 데이터가 죽었고 데이터를 제로화하는 것은 시간과 PC 자원을 낭비한다는 것을 알고 있습니다. 삭제 된 데이터를 제로화하는 옵션이어야합니다. RM은 ext4에서 현실 세계에서 오래 걸리는 것입니다.

답변 : 모든 파일을 반복적으로 연결 해제하면 속도가 약간 빨라지지만 FSCK를 실행하려면 시간을 따로 설정해야합니다.

재귀 "FOR"명령을 실행하여 폴더 아래의 모든 파일을 "링크 해제"한 다음 모든 폴더를 rm 또는 rmdir로 정리하여 정리할 수있는 스크립트를 작성하십시오. 편리 할 때 나머지 데이터를 제로화하기 위해 FSCK를 수동으로 실행하십시오. 킨디 게으른 미안 해요 :).


0

기존 디렉토리를 제거하려는 경우 유용하지는 않지만 정기적으로 제거해야하는 파일이 많은 디렉토리가있는 경우 가능한 전략은 디렉토리를 자체 파일 시스템에 두는 것입니다 ( 예를 들어 , 파티션). 그런 다음 제거해야 할 때 마운트를 해제하고을 실행 한 mkfs후 다시 마운트하십시오. 예를 들어, OpenBSD/usr/obj 는 시스템을 빌드하는 동안 많은 파일이 생성되고 다음 빌드 전에 삭제해야하는 경우이 작업을 수행하도록 권장합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.