하위 폴더가 많은 폴더를 빠르게 삭제하려면 어떻게해야합니까?


15

266778 하위 폴더가있는 폴더가 있습니다. 어떻게 삭제합니까?

나는 시도했다

cd ~/.local/share/Trash/
sudo rm -rf *

그러나 시간이 많이 걸립니다. 실시간으로 1 분 25 초 및 사용자 시간 0.072 초 후에 2500 개의 폴더 만 삭제되었습니다. 이렇게하면이 폴더를 삭제하는 데 2 ​​시간 이상이 걸립니다.

이 폴더를 더 빨리 삭제하는 방법이 있습니까? 사용자 시간과 실시간이 왜 그렇게 큰 차이가 있습니까?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Linux 2.6.32 (Ubuntu 10.04.4 LTS)를 사용합니다.


방금이 문제를 봤는데 일부 사람들은 rsync가 "많은 파일 삭제"도구로 매우 효율적으로 사용될 수 있음을 발견 한 것 같습니다. 그것이 더 빠른지 평가하는 것은 당신에게 달려 있습니다.
Johan

2
많은 폴더 / 파일을 삭제할 때의 성능은 파일 시스템에 따라 크게 달라집니다. 내 경험상 ext3 (느린)에서 XFS (빠른)로 수백만 개의 작은 파일을 삭제할 때의 차이는 몇 시간이 될 수 있습니다.
pdo

이 경우가 자주 있고 btrfs와 같은 파일 시스템과 하위 볼륨을 사용하여 미리 계획을 세울 수 있으면 해당 하위 볼륨을 덤프하면 작업 속도가 빨라질 수 있습니다.
PlasmaHH

여기서 답변을 찾을 수 있습니다. 펄 하나가 가장 빠릅니다. unix.stackexchange.com/questions/37329/…
SDsolar

답변:


17

"find"버전이 -delete 부속 명령을 구현하는 경우 시도 할 수 있습니다

find directory -delete

이 경우 :

find ~/.local/share/Trash/ -delete

rm과 같은 일부 명령은 커널에서 대부분의 작업을 수행합니다. 파일 시스템 루틴에서 정확히 말하면 시스템 호출을 수행하는 데 소요되는 시간은 이러한 방식으로 설명되므로 "rm"명령이 오랫동안 실행되는 동안 사용자 영역에서 많은 작업을 수행하지 않습니다. 시스템 호출은 대부분의 작업을 수행합니다.


+1; 이것은 또한 부모 디렉토리를 삭제하고 난 OP는 휴지통 폴더가 아닌 폴더 자체의 내용을 삭제하고 싶었 생각하지만
don_crissti

1
@ don_crissti : 좋은 말. 경우 영업 이익은 거치지 만 ~ / .local / share / 휴지통에서 삭제 만 하위 디렉토리에 원하는 (그리고 1 수준에 파일) 다음 : find ~/.local/share/Trash/*/ -delete (물론,이 것 그 쓰레기의에서 또한 삭제 파일 (및 DIRS) / * / subdirs도)
Olivier Dulac

2
– 1의 이상한 행동을 설명하기위한 +1time
Martin Thoma

3
find directory -delete진짜보다 더 빨리 rm -rf directory? 결국 그들은 동일한 작업을 수행하며 두 가지 방법이 없습니다.
Gilles 'SO- 악마 그만'

1
@Johan find는 정말 빠릅니다. 이유를 찾을 기회가 있었습니까?
Harshdeep

20

그것은 당신의 fast 정의에 달려 있습니다 . 이미 여기에있는 대답은 파일 시스템에서 디렉토리를 실제로 제거하는 좋은 해결책을 제공하지만 실제로 필요한 디렉토리 이름 을 가능한 한 빨리 해제 해야하는 경우 동일한 파일 시스템의 이름 바꾸기가 즉시 이루어집니다.

{ mv directory directory.gone && rm -rf directory.gone; } &

기술적으로 실제 삭제를 가속화하지 않았기 때문에 부정 행위이지만 실제로는 매우 유용합니다.이 트릭을 항상 사용하므로 느린 삭제 작업을 기다릴 필요가 없습니다.


큰. 이 작업을 항상 수행하는 유스 케이스는 무엇입니까? 당신이 그것을 많이한다면, 당신은 백 로그 할 위험이 있습니까, 여러 개의 'directory.gone 's을 얻지 못하고 실패합니까? '$$'또는 '% (date ...)'와 같은 접미사를 사용한다고 가정합니다.
smci

1
필요한 경우 mktemp를 인수와 함께 사용하여 동일한 파일 시스템에 유지되도록 할 수 있습니다. 그러나 지금 구체적인 예가 있다고 말할 수는 없습니다.
kojiro

kojiro 그래 고마워, mktemp내가 기억하려고했던 것은 ...
smci

1

rm -rf directory또는 rm -rf *로컬 rm구현이 중단 되지 않는 한 물론 가장 빠른 방법 입니다.

사용 find하면 이점이 없습니다.

이것이 빠른지 느린지는 주로 파일 시스템과 OS 구현에 달려 있습니다. 그래서 그 질문은 부적절 해 보입니다.

Solaris에서 UFS 및 ZFS는 모두 파일 시스템 구현이 발생 배경 삭제 코드 지연 등이 같은 작업의 이런 종류의 매우 빠른 것으로 알려져있다 unlink()rmdir()통화 관련 객체가 총에 더 많은 시간이 걸릴 것입니다 경우에도 빠른 반환을.

커널에서 백그라운드 삭제가 지연되면 디렉토리 업데이트도 빠르게 수행 될 수 있으며 전체 작업 속도를 높이는 데 도움이됩니다.


그렇게 생각하면 용서받을 수 있지만, 이 답변이 설명하는 것처럼 이것은 사실이 아닙니다 .
Hitechcomputergeek

0

이것은 부분적인 대답 일 뿐이며 명령이 반환하는 세 가지 값을 나타냅니다. time(1)맨 페이지 에서 인용 :

(ⅰ) 호출 및 종료 사이에 경과 된 실제 시간, (ⅱ) 사용자 CPU 시간 (합계를 tms_utime하고 tms_cutime있는 중시하는 struct tms의해 반환 times(2)), 및 (iii) 시스템 CPU 시간 (의 합 tms_stimetms_cstimeA의 값 struct tms에 의해 반환 됨 times(2)). "

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