수천 개의 파일이 포함된 대규모 디렉터리를 효율적으로 삭제합니다.

수천 개의 파일이 포함된 대규모 디렉터리를 효율적으로 삭제합니다.

수십만 개의 작은 파일로 인해 폴더가 다루기 어려워지는 문제가 발생했습니다.

실행 시 오류를 반환 하는 파일이 많이 있으며 rm -rf, 우리가 해야 할 일은 다음과 같습니다:

find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;

이 방법은 작동하지만 속도가 매우 느리고 메모리 부족으로 인해 실패하는 경우가 많습니다.

더 좋은 방법이 있나요? 이상적으로는 내용에 신경 쓰지 않고 전체 디렉토리를 삭제하고 싶습니다.

답변1

rsync를 사용하는 것은 놀라울 정도로 빠르고 쉽습니다.

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

@sarath의 답변또 다른 빠른 옵션이 언급되었습니다: Perl! 벤치마크는 rsync -a --delete.

cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'

또는 없이 stat(필요한지 여부는 논쟁의 여지가 있습니다. 어떤 사람들은 그것이 있으면 더 빠를 것이라고 말하고 다른 사람들은 그것이 없으면 더 빠르다고 말합니다):

cd yourdirectory
perl -e 'for(<*>){unlink}'

원천:

  1. https://stackoverflow.com/questions/1795370/unix-fast-remove-directory-for-cleaning-up-daily-builds
  2. http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
  3. https://www.quora.com/Linux-why-stat+unlink-can-be-faster-than-a-single-unlink/answer/Kent-Fredric?srid=O9EW&share=1

답변2

여기 누군가트위터-delete대신 사용하는 것이 좋습니다 .-exec rm -f{} \;

이렇게 하면 명령이 더 효율적이게 되지만 여전히 재귀를 사용하여 모든 것을 반복합니다.

답변3

깔끔한 트릭:

rsync -a --delete empty/ your_folder/

슈퍼 CPU 집약적이지만 매우 빠릅니다. 바라보다https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html

답변4

댓글 중 하나를 확장하면, 당신이 하고 있다고 생각하는 일을 하고 있는 것 같지 않습니다.

먼저 상황을 시뮬레이션하기 위해 여러 파일을 만들었습니다.

$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done

그런 다음 실패할 것으로 예상되는 작업과 질문에서 수행 중인 작업을 시도했습니다.

$ rm -r foo/*
bash: /bin/rm: Argument list too long

하지만 이것은하다일하다:

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

관련 정보