공식적으로 모든 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 number
pv
총계가 무엇인지 알려주 므로 견적을 줄 수 있습니다.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/null
logfile
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 4
I / 초당 O 작업보고 (물론 킬로바이트 / S를,하지만 그건 순수한 메타 데이터 I / O에 매우 관련이 아니다).
어떤 파일이에 대한 호기심 얻을 경우 rm
현재 작업하고, 당신은 첨부 할 수 있습니다 strace
그것과 같이보고 unlink()
(그리고 getdents) 시스템 호출 터미널에 토 해낸다. 예 sudo strace -p $(pidof rm)
. ^c
strace를 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
것입니다. 아마도 네트워크 파일 시스템으로 방황하거나 비슷한 것일까 요?
코드 링크는 다음과 같습니다.