수십만 개의 작은 파일로 인해 폴더가 다루기 어려워지는 문제가 발생했습니다.
실행 시 오류를 반환 하는 파일이 많이 있으며 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}'
원천:
답변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