진행 상황을 보면서 디렉토리에서 수십억 개의 파일 삭제 파일 인 수십억 개의 파일이있는 30TB의

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

sudo rm -rf bolands-mills-mhcptz

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

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



답변

파일 당 한 줄 인쇄를 삭제 하는 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.

답변

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봅니다.


답변

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

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프로세스가 현재 찾고있다.


답변

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

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

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

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

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

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


답변

할 수있는 한 가지 일은 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) 음, 상대적 말에 비해 간단하고, 핵 물리학, 리만 가설, 또는 어떤 크리스마스 내 아내를 구입 🙂


답변

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

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

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