공식적으로 모든 JPEG 파일 인 수십억 개의 파일이있는 30TB의 디렉토리가 있습니다. 다음과 같이 파일의 각 폴더를 삭제하고 있습니다.
sudo rm -rf bolands-mills-mhcptz
이 명령은 작동하며 작동 여부에 관계없이 아무 것도 표시하지 않습니다.
파일을 삭제하거나 명령의 현재 상태를 확인하고 싶습니다.
rm -ri
. 재미있을 것!
공식적으로 모든 JPEG 파일 인 수십억 개의 파일이있는 30TB의 디렉토리가 있습니다. 다음과 같이 파일의 각 폴더를 삭제하고 있습니다.
sudo rm -rf bolands-mills-mhcptz
이 명령은 작동하며 작동 여부에 관계없이 아무 것도 표시하지 않습니다.
파일을 삭제하거나 명령의 현재 상태를 확인하고 싶습니다.
rm -ri
. 재미있을 것!
답변:
파일 당 한 줄 인쇄를 삭제 하는 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
.pv
수십억 개의 파일을 계산하는 데 너무 비싸지 않다고 가정하면 잘 사용 합니다. ;-). ( rm
측정 하는 데 거의 시간이 걸릴 수 있습니다 !)
pv
입력에도 불구하고, 한 번만 초당 새로 고침을 진행 표시 줄을. 따라서 터미널은 초당 톤 대신 한 줄만 표시하면됩니다. pv
마주 치는 줄 바꿈마다 카운터를 증분하면됩니다. 줄 바꿈을 수행하는 것보다 빠르며 터미널에 줄을 표시하지 않아도됩니다. pv
이런 식으로 실행 하면 파일 제거가 단순히보다 빠릅니다 rm -rv
.
rm -rv dirname | pv -l -s $(find dirname | wc -l) > logfile
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
프로세스가 현재 찾고있다.
df -ih
실제로 rm
진행 상황 을 볼 수있는 아주 저렴한 방법입니다 .
/boot
EFI 시스템 파티션 에 수십억 개의 파일이 없을 것입니다 .
위의 답변 모두 사용하는 동안 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이지만, 나는 그런 종류의 일에 좋을 것이라는 인상을 받고 있습니다.
할 수있는 한 가지 일은 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
것입니다. 아마도 네트워크 파일 시스템으로 방황하거나 비슷한 것일까 요?
코드 링크는 다음과 같습니다.