진행 상황을 보면서 디렉토리에서 수십억 개의 파일 삭제


36

공식적으로 모든 JPEG 파일 인 수십억 개의 파일이있는 30TB의 디렉토리가 있습니다. 다음과 같이 파일의 각 폴더를 삭제하고 있습니다.

sudo rm -rf bolands-mills-mhcptz

이 명령은 작동하며 작동 여부에 관계없이 아무 것도 표시하지 않습니다.

파일을 삭제하거나 명령의 현재 상태를 확인하고 싶습니다.


19
답변하지 않음 : 간혹 유지하려는 항목을 백업하고, 포맷하고, 유지하려는 항목을 복원하는 것이 더 빠릅니다. 다른 답변 : unix.stackexchange.com/questions/37329/…
Eric Towers

2
어떤 특정 파일이 제거되었는지 알기보다는 진행 상황 만 알고 싶다면 "df / dev / sd_whatever_the_drive_is"를 실행할 수 있습니다.
jamesqf

11
단일 디렉토리에 수십억 개의 파일이 어떻게 생겼습니까 ?
Monica와의 가벼움 경주

1
@MichaelHampton 그러나 파일이 별도의 데이터 세트가 아닌 경우 시간이 오래 걸릴 수 있습니다. (ZFS에서) serverfault.com/questions/801074/…
v7d8dpo4

5
수십억 개의 파일? 시도하십시오 rm -ri. 재미있을 것!
OldBunny2800

답변:


98

파일 당 한 줄 인쇄를 삭제 하는 rm -v데 사용할 수 있습니다 rm. 이렇게하면 rm실제로 파일을 삭제하는 중임을 알 수 있습니다. 그러나 수십억 개의 파일이 있다면 rm여전히 작동하는 것입니다. 이미 삭제 된 파일 수와 남은 파일 수를 모를 것입니다.

이 도구 pv는 진행률 추정에 도움이 될 수 있습니다.

http://www.ivarch.com/programs/pv.shtml

다음은 호출하는 것이 어떻게 rm함께 pv예제 출력

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

이 고안된 예에서는 파일 pv이 있다고 말했습니다 1000. 의 출력 pv결과는 562가 이미 삭제 되었으며 경과 시간은 7 초이며 완료 예상은 5 초입니다.

몇 가지 설명 :

  • pv -l만들어 pv줄 바꿈 대신 바이트로 계산
  • pv -s numberpv총계가 무엇인지 알려주 므로 견적을 줄 수 있습니다.
  • logfile끝에 리디렉션 은 깨끗한 출력을위한 것입니다. 그렇지 않으면의 상태 라인 pv이의 출력과 섞입니다 rm -v. 보너스 : 삭제 된 내용에 대한 로그 파일이 있습니다. 그러나 파일이 커질 것이라는 점에주의하십시오. /dev/null로그가 필요없는 경우 리디렉션 할 수도 있습니다 .

파일 수를 얻으려면이 명령을 사용할 수 있습니다.

$ find dirname | wc -l

수십억 개의 파일이 있으면 시간이 오래 걸릴 수 있습니다. pv여기를 사용 하여 계산 한 금액을 확인할 수 있습니다

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

여기에서 278k 파일을 계산하는 데 4 초가 걸렸습니다. 끝에있는 정확한 개수 ( 278044)는의 출력입니다 wc -l.

계산을 기다리지 않으려면 파일 수를 추측하거나 pv추정하지 않고 사용할 수 있습니다 .

$ rm -rv dirname | pv -l > logfile

이와 같이 완료 할 것으로 예상 할 수는 없지만 최소한 이미 삭제 된 파일 수를 볼 수 있습니다. /dev/null로그 파일이 필요하지 않은 경우 리디렉션 하십시오.


Nitpick :

  • 정말로 필요 sudo합니까?
  • 일반적으로 rm -r재귀 적으로 삭제하기에 충분합니다. 필요가 없습니다 rm -f.

5
pv수십억 개의 파일을 계산하는 데 너무 비싸지 않다고 가정하면 잘 사용 합니다. ;-). ( rm측정 하는 데 거의 시간이 걸릴 수 있습니다 !)
Stephen Kitt

7
그것은 : @StephenKitt이 정말 Windows 파일 유틸리티에 대해 나에게 (그리고 많은 다른 사람)를 괴롭히는 것입니다 항상 실패하지 않고, 드라이브가 아닌, 수와 삭제하기 전에 파일의 크기를 계산, 많은 프로세서보다 느리게을 거의 소요 실제 삭제하는 한!
wizzwizz4

@ wizzwizz4 참으로! 것보다 더있어 그 IIRC하지만 - 그것은 그것이 확인 할 수 삭제하기 전에 모든 것을 삭제 아무것도 , "모 아니면도"를되고 삭제의 기회를 증가 할 수 있습니다. 몇 년 전에 Windows 용 파일 시스템 드라이버를 작성했지만 Explorer가 삭제하는 방식과 관련된 몇 가지 사항을 포함하여 우리가 다루어야 할 몇 가지 이상한 점이 있었지만 세부 사항을 기억할 수는 없습니다. (폴더를 만들려면 새 폴더에 파일을 쓰고 삭제해야합니다!)
Stephen Kitt

7
@StephenKitt 어쩌면 내가 틀렸지 만 디스크 액세스 외에도 터미널 출력에 병목 현상이 있습니까? 저는 믿습니다 pv입력에도 불구하고, 한 번만 초당 새로 고침을 진행 표시 줄을. 따라서 터미널은 초당 톤 대신 한 줄만 표시하면됩니다. pv마주 치는 줄 바꿈마다 카운터를 증분하면됩니다. 줄 바꿈을 수행하는 것보다 빠르며 터미널에 줄을 표시하지 않아도됩니다. pv이런 식으로 실행 하면 파일 제거가 단순히보다 빠릅니다 rm -rv.
JoL

1
@skywinderrm -rv dirname | pv -l -s $(find dirname | wc -l) > logfile
lesmana

28

lesmana의 답변을 확인하십시오. 내 것보다 낫습니다. 특히 마지막 pv예는 대신 대신 rm지정 하면 원래의 침묵보다 훨씬 오래 걸리지 않습니다 ./dev/nulllogfile

rm지원 옵션을 가정하면 (Linux를 실행 한 이후로 가능할 것입니다) 다음을 사용하여 상세 모드로 실행할 수 있습니다 -v.

sudo rm -rfv bolands-mills-mhcptz

다수의 주석가들이 지적한 바와 같이, 이것은 단말기에 의해 생성되고 디스플레이되는 출력량으로 인해 매우 느릴 수있다. 대신 출력을 파일로 리디렉션 할 수 있습니다.

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

의 크기를 rm-trace.txt봅니다.


5
이것은 실제로 때문에 출력이 생성 및 터미널 :)에 렌더링되는 모든 삭제 속도가 느려질 수
rackandboneman

2
물론 속도가 느려집니다. 파일에 수십억 줄을 쓰는 것은 제 시간에 이루어지지 않습니다.
user207421

23

다른 옵션은 파일 시스템의 파일 수가 줄어드는 것을 보는 것입니다. 다른 터미널에서 다음을 실행하십시오.

watch  df -ih   pathname

사용 된 아이디어 수 rm는 진행에 따라 줄어 듭니다 . (예를 들어 트리가로 만든 경우와 같이 파일에 대부분 여러 링크가없는 경우 cp -al). 파일 수 (및 디렉토리)와 관련하여 삭제 진행률을 추적합니다. df없이는 -i사용 된 공간 측면에서 추적합니다.

또한 실행할 수 iostat -x 4I / 초당 O 작업보고 (물론 킬로바이트 / S를,하지만 그건 순수한 메타 데이터 I / O에 매우 관련이 아니다).


어떤 파일이에 대한 호기심 얻을 경우 rm현재 작업하고, 당신은 첨부 할 수 있습니다 strace그것과 같이보고 unlink()(그리고 getdents) 시스템 호출 터미널에 토 해낸다. 예 sudo strace -p $(pidof rm). ^cstrace를 rm중단하지 않고 분리 할 수 있습니다 .

rm -r디렉토리를 트리로 변경 하면 삭제됩니다. 그렇다면 당신은 볼 수 /proc/<PID>/cwd있습니다. 그것의 /proc/<PID>/fd당신이 당신의 무엇을보고 그 볼 수 있도록 힘은 종종 디렉토리, 개방 전략 중 한 rm프로세스가 현재 찾고있다.


2
df -ih실제로 rm진행 상황 을 볼 수있는 아주 저렴한 방법입니다 .
Stephen Kitt

BTW, 이것은 사용 된 아이 노드 수가 항상 0 인 BTRFS에서 작동하지 않습니다. : (FAT32와 동일하지만 /bootEFI 시스템 파티션 에 수십억 개의 파일이 없을 것입니다 .
Peter Cordes

4

위의 답변 모두 사용하는 동안 rm, rm나는 최근에 관찰 추출 할 때 실제로 보관 된 .tar A는을 삭제보다 적은 시간이 걸렸에서 실제로 ~, 파일의 큰 숫자를 삭제에서 매우 느린 100K 파일이 될 수 있습니다. 이 방법으로 실제로 질문에 대답하지는 않지만 문제에 대한 더 나은 해결책은 다른 방법을 사용하여 파일을 삭제하는 것입니다 (예 : 이 질문에 대한 찬성 답변 중 하나) .

내가 가장 좋아하는 방법은을 사용하는 것 rsync -a --delete입니다. 필자는이 방법이 그 질문에 대해 가장 많이 찬성 된 답변 보다 사용하기 쉬워 질만큼 충분히 빠르다는 것을 알았 습니다. 저자는 컴파일해야 할 C 프로그램을 작성했습니다. (이것은 처리되는 모든 파일을 stdout으로 출력합니다 rm -rv. 이렇게하면 프로세스가 놀라운 속도로 느려질 수 있습니다.이 출력을 원하지 않으면 rsync -aq --delete출력을 파일로 대신 사용 하거나 리디렉션하십시오.)

그 답변의 저자는 다음과 같이 말합니다.

이제 프로그램은 (내 시스템에서) 43 초 안에 1000000 개의 파일을 삭제합니다. 가장 가까운 프로그램은 rsync -a --delete로 60 초가 걸렸습니다 (삭제도 순서대로 수행하지만 효율적인 디렉토리 조회는 수행하지 않음).

나는 이것이 내 목적에 충분하다는 것을 알았습니다. 적어도 ext4를 사용하는 경우 그 대답에서 중요 할 수도 있습니다.

예상대로 영향을받는 디렉토리를 제거하고 나중에 다시 만들어야합니다. 디렉토리는 크기가 커질뿐 디렉토리의 크기 때문에 파일이 몇 개 있어도 성능이 저하 될 수 있습니다.


허, 나는 기대 rm했거나 find --delete효율적일 것이다. 삭제하는 동안 b- 트리 리 밸런스를 피하기 위해 정렬 순서로 삭제하는 것에 대한 흥미로운 점. 그 중 어느 것이 다른 파일 시스템에 적용되는지 확실하지 않습니다. XFS는 디렉토리 당 수백만 개의 파일로도 좋지 않습니다. BTRFS에 대해서는 IDK이지만, 나는 그런 종류의 일에 좋을 것이라는 인상을 받고 있습니다.
Peter Cordes

두 번째 인용문은 파일 시스템의 유형에 의존하지 않습니다 ...
Menasheh

@ Menasheh 좋은 지적, 나는 그것을 내 대답으로 편집했습니다.
Hitechcomputergeek

3

할 수있는 한 가지 일은 rm백그라운드 에서 프로세스 를 시작하고 (출력이 없으므로 속도가 느려지지 않음) 간단한 (a) 명령으로 포 그라운드에서 프로세스를 모니터링하는 것입니다 .

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

find/wc콤보는 당신에게 당신이 원하는 단위를 줄 수있는 도구로 대체 할 수있다.


(A) 음, 상대적 말에 비해 간단하고, 핵 물리학, 리만 가설, 또는 어떤 크리스마스 내 아내를 구입 :-)


0

얼마 전에 나는 줄이 인쇄 된 속도를 인쇄 할 내용을 썼습니다. 당신은 실행할 수 있으며 rm -rfv | ./counter초당 분당 라인을 인쇄합니다. 직접적인 진전은 아니지만 진행률에 대한 피드백을 줄 rm것입니다. 아마도 네트워크 파일 시스템으로 방황하거나 비슷한 것일까 요?

코드 링크는 다음과 같습니다.

http://www.usenix.org.uk/code/counter-0.01.tar.gz

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