진행 상황을 보는 동안 디렉터리에서 수십억 개의 파일 삭제

진행 상황을 보는 동안 디렉터리에서 수십억 개의 파일 삭제

저는 수십억 개의 파일이 모두 JPEG 파일 형식으로 포함된 30TB 디렉토리를 가지고 있습니다. 다음과 같이 각 폴더의 파일을 삭제합니다.

sudo rm -rf bolands-mills-mhcptz

명령이 실행되고 작동 여부에 관계없이 아무 것도 표시되지 않습니다.

파일을 삭제하는 것인지, 명령의 현재 상태가 어떤 것인지 알고 싶습니다.

답변1

삭제된 각 파일에 대해 한 줄씩 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. 출력에는 pv562가 삭제되었으며 경과 시간은 7초, 예상 완료 시간은 5초가 표시됩니다.

몇 가지 설명:

  • pv -lpv바이트 대신 개행 문자로 계산
  • 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로그 파일이 필요하지 않은 경우 로 리디렉션하세요.


잔소리:

  • 정말로 필요합니까 sudo?
  • 일반적 rm -r으로 재귀적으로 삭제하면 충분합니다. 불필요한 rm -f.

답변2

확인하다레스마나의 답변, 그것은 내 것보다 훨씬 낫습니다. 특히 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.

답변3

또 다른 옵션은 파일 시스템의 파일 수가 감소하는 것을 관찰하는 것입니다. 다른 터미널에서 다음을 실행합니다.

watch  df -ih   pathname

rm진행됨에 따라 사용되는 inode 수가 감소합니다. (예를 들어 트리가 cp -al. 이는 여러 파일(및 디렉터리)의 삭제 진행 상황을 추적합니다. 사용된 공간은 추적되지 df않습니다 .-i

또한 실행 iostat -x 4하여 초당 I/O 작업(및 kiB/s, 그러나 이는 순수 메타데이터 I/O와 관련성이 낮음)을 볼 수도 있습니다.


rm현재 처리 중인 파일이 무엇인지 궁금하다면 해당 파일에 첨부하여 터미널에 시스템 호출이 나타나는지 strace확인 (및 getdents)할 수 있습니다. unlink()예를 들어 sudo strace -p $(pidof rm). ^cstrace를 중단하지 않고 분리할 수 있습니다.rm

rm -r삭제하려는 트리로 디렉토리를 변경했는지 잊어버렸습니다 . 그렇다면 살펴보세요 /proc/<PID>/cwd. 종종 fd 디렉터리를 열 수 있으므로 해당 디렉터리를 조사하여 현재 프로세스가 무엇을 보고 있는지 /proc/<PID>/fd확인할 수 있습니다 .rm

답변4

당신이 할 수 있는 한 가지는 백그라운드에서 프로세스를 시작한 다음 (출력이 없으므로 속도가 느려지지 않음) 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는 필요한 단위를 제공하는 어떤 도구로든 교체할 수 있습니다.


(우물 ,비교적핵물리학, 리만 가설, 또는 크리스마스에 아내에게 무엇을 사줄지에 비해 간단합니다 :-)

관련 정보