Menghapus miliaran file dari direktori sambil melihat progresnya juga

36

Saya memiliki direktori 30 TB yang memiliki miliaran file di dalamnya yang secara resmi semua file JPEG. Saya menghapus setiap folder file seperti ini:

sudo rm -rf bolands-mills-mhcptz

Perintah ini hanya berjalan dan tidak menunjukkan apa-apa apakah itu berfungsi atau tidak.

Saya ingin melihat karena menghapus file atau apa status perintah saat ini.

Junaid Farooq
sumber
19
Tidak menjawab: Terkadang lebih cepat untuk membuat cadangan barang yang ingin Anda simpan, memformat, dan mengembalikan barang yang ingin Anda simpan. Jawaban lain: unix.stackexchange.com/questions/37329/…
Eric Towers
2
Jika Anda hanya menginginkan gagasan kemajuan, daripada mengetahui file tertentu yang telah dihapus, Anda dapat menjalankan "df / dev / sd_wh whatever_the_drive_is".
jamesqf
11
Bagaimana Anda bisa menghasilkan milyaran file dalam satu direktori?
Lightness Races with Monica
1
@MichaelHampton Tetapi jika file tersebut bukan dataset terpisah, mungkin butuh waktu lama. (pada ZFS) serverfault.com/questions/801074/…
v7d8dpo4
5
Miliaran file, ya? Coba rm -ri. Akan menyenangkan!
OldBunny2800

Jawaban:

98

Anda dapat menggunakan rm -vuntuk rmmencetak satu baris per file dihapus. Dengan cara ini Anda dapat melihat bahwa rmmemang berfungsi untuk menghapus file. Tetapi jika Anda memiliki miliaran file maka yang akan Anda lihat adalah yang rmmasih berfungsi. Anda tidak akan tahu berapa banyak file yang sudah dihapus dan berapa banyak yang tersisa.

Alat ini pvdapat membantu Anda dengan estimasi kemajuan.

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

Berikut adalah bagaimana Anda akan memanggil rmdengan pvdengan contoh keluaran

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

Dalam contoh buat ini saya mengatakan pvbahwa ada 1000file. Output dari pvmenunjukkan bahwa 562 sudah dihapus, waktu yang berlalu adalah 7 detik, dan estimasi untuk menyelesaikan dalam 5 detik.

Beberapa penjelasan:

  • pv -lmembuat pvuntuk menghitung dengan baris baru, bukan byte
  • pv -s numbermemberi tahu pvapa totalnya sehingga dapat memberi Anda perkiraan.
  • Redirect ke logfilepada akhirnya adalah untuk output bersih. Kalau tidak, baris status dari pvakan tercampur dengan output dari rm -v. Bonus: Anda akan memiliki file log dari apa yang telah dihapus. Namun waspadalah file tersebut akan menjadi besar. Anda juga dapat mengalihkan ke /dev/nulljika Anda tidak perlu log.

Untuk mendapatkan jumlah file, Anda dapat menggunakan perintah ini:

$ find dirname | wc -l

Ini juga bisa memakan waktu lama jika ada miliaran file. Anda dapat menggunakan di pvsini juga untuk melihat berapa yang telah dihitung

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

Di sini dikatakan bahwa butuh 4 detik untuk menghitung 278k file. Hitungan tepat di akhir ( 278044) adalah output dari wc -l.

Jika Anda tidak ingin menunggu penghitungan maka Anda bisa menebak jumlah file atau menggunakan pvtanpa estimasi:

$ rm -rv dirname | pv -l > logfile

Seperti ini, Anda tidak akan memiliki estimasi untuk selesai tetapi setidaknya Anda akan melihat berapa banyak file yang sudah dihapus. Arahkan ulang ke /dev/nulljika Anda tidak memerlukan logfile.


Nitpick:

  • Anda benar-benar membutuhkan sudo?
  • biasanya rm -rcukup untuk menghapus secara rekursif. tidak perlu untuk rm -f.
lesmana
sumber
5
Penggunaan yang bagus pv, dengan anggapan tidak terlalu mahal untuk menghitung milyaran file ;-). (Mungkin perlu waktu yang hampir sama dengan rmyang seharusnya diukur!)
Stephen Kitt
7
@StephenKitt Inilah yang benar-benar mengganggu saya (dan banyak orang lain) tentang utilitas file Windows: selalu , tanpa gagal, menghitung jumlah dan ukuran file sebelum menghapus yang, kecuali drive jauh lebih lambat daripada prosesor, membutuhkan waktu hampir sama selama penghapusan yang sebenarnya!
wizzwizz4
@ wizzwizz4 Memang! Ada lebih dari itu meskipun IIRC - itu memeriksa bahwa ia dapat menghapus semuanya sebelum menghapus apa pun , untuk meningkatkan kemungkinan penghapusan menjadi "semua atau tidak sama sekali". Beberapa tahun yang lalu saya menulis driver sistem file untuk Windows, ada beberapa keanehan yang harus kami tangani, termasuk beberapa yang berkaitan dengan cara Explorer menghapus, tetapi saya tidak dapat mengingat detailnya. (Saya ingat bahwa membuat folder melibatkan penulisan dan penghapusan file di folder baru!)
Stephen Kitt
7
@StephenKitt Mungkin saya salah, tetapi bukankah kemacetan, selain akses disk, output terminal? Saya percaya pvmenyegarkan progress bar hanya sekali per detik, terlepas dari inputnya. Jadi, terminal hanya perlu menampilkan satu baris daripada satu ton setiap detik. pvhanya perlu menambah penghitung untuk setiap baris baru yang dihadapinya; itu harus lebih cepat daripada melakukan pembungkus garis, dan yang lainnya untuk menampilkan garis di terminal. Saya pikir menjalankan dengan pvseperti ini menyebabkan penghapusan file menjadi lebih cepat dari sekadar rm -rv.
JoL
1
@skywinderrm -rv dirname | pv -l -s $(find dirname | wc -l) > logfile
lesmana
28

Lihatlah jawaban lesmana , ini jauh lebih baik daripada jawaban saya - terutama pvcontoh terakhir , yang tidak akan lebih lama dari yang asli diam rmjika Anda menentukan /dev/nullbukan logfile.

Dengan asumsi Anda rmmendukung opsi (mungkin karena Anda menjalankan Linux), Anda dapat menjalankannya dalam mode verbose dengan -v:

sudo rm -rfv bolands-mills-mhcptz

Seperti yang telah ditunjukkan oleh sejumlah komentator, ini bisa sangat lambat karena jumlah output yang dihasilkan dan ditampilkan oleh terminal. Anda bisa mengarahkan output ke file:

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

dan perhatikan ukuran rm-trace.txt.

Stephen Kitt
sumber
5
Ini sebenarnya dapat memperlambat penghapusan karena semua output yang dihasilkan dan di-render ke terminal :)
rackandboneman
2
Tentu saja itu akan melambat. Menulis miliaran baris ke file tidak terjadi dalam waktu nol.
user207421
23

Pilihan lain adalah untuk menonton jumlah file pada penurunan filesystem. Di terminal lain, jalankan:

watch  df -ih   pathname

Hitungan inode yang digunakan akan berkurang seiring rmkemajuan. (Kecuali jika sebagian besar file memiliki banyak tautan, mis. Jika pohon dibuat dengan cp -al). Ini melacak penghapusan kemajuan dalam hal jumlah file (dan direktori). dftanpa -iakan melacak dalam hal ruang yang digunakan.

Anda juga dapat menjalankan iostat -x 4untuk melihat operasi I / O per detik (dan juga kiB / s, tetapi itu tidak terlalu relevan untuk I / O metadata murni).


Jika Anda ingin tahu tentang file apa rmyang sedang dikerjakan, Anda dapat melampirkannya stracedan menonton ketika unlink()panggilan sistem (dan getdents) memuntahkan di terminal Anda. mis sudo strace -p $(pidof rm). Anda dapat ^cmelepaskan tali rmtanpa memotongnya.

Saya lupa jika rm -rdirektori perubahan ke pohon itu dihapus; jika demikian Anda bisa melihat /proc/<PID>/cwd. Ini /proc/<PID>/fdmungkin sering memiliki direktori fd terbuka, sehingga Anda bisa melihatnya untuk melihat apa yang sedang dilihat oleh rmproses Anda .

Peter Cordes
sumber
2
df -ihmemang cara murah yang bagus untuk menonton rmkemajuan.
Stephen Kitt
BTW, ini tidak berfungsi pada BTRFS, di mana jumlah inode yang digunakan selalu nol. :( Sama dengan FAT32, tetapi Anda mungkin tidak memiliki milyaran file di /bootpartisi sistem EFI Anda .
Peter Cordes
4

Sementara jawaban di atas semuanya digunakan rm, rmsebenarnya bisa sangat lambat dalam menghapus sejumlah besar file, seperti yang baru-baru ini saya amati ketika mengekstraksi ~ 100 ribu file dari arsip .tar sebenarnya membutuhkan waktu lebih sedikit daripada menghapusnya. Meskipun ini sebenarnya tidak menjawab pertanyaan yang Anda ajukan, solusi yang lebih baik untuk masalah Anda mungkin menggunakan metode berbeda untuk menghapus file Anda, seperti salah satu jawaban yang dipilih untuk pertanyaan ini .

Metode favorit pribadi saya adalah menggunakan rsync -a --delete. Saya menemukan bahwa metode ini berkinerja cukup cepat sehingga sebanding dengan kemudahan penggunaan atas jawaban yang paling banyak dipilih untuk pertanyaan itu , di mana penulis telah menulis program C yang perlu Anda kompilasi. (Perhatikan bahwa ini akan menampilkan setiap file yang sedang diproses ke stdout, seperti rm -rv; ini dapat memperlambat proses dengan jumlah yang mengejutkan. Jika Anda tidak ingin keluaran ini, gunakan rsync -aq --deleteatau arahkan output ke file sebagai gantinya.)

Penulis jawaban itu mengatakan:

Program sekarang akan (pada sistem saya) menghapus 10.00000 file dalam 43 detik. Program terdekat dengan ini adalah rsync -a --delete yang membutuhkan 60 detik (yang juga melakukan penghapusan secara berurutan juga, tetapi tidak melakukan pencarian direktori yang efisien).

Saya telah menemukan bahwa ini cukup baik untuk tujuan saya. Juga berpotensi penting dari jawaban itu, setidaknya jika Anda menggunakan ext4:

Sebagai pemikiran, seseorang harus menghapus direktori yang terkena dampak dan membuat ulang setelahnya. Direktori hanya bertambah ukurannya dan dapat tetap berkinerja buruk bahkan dengan beberapa file di dalamnya karena ukuran direktori.

Hitechcomputergeek
sumber
ya, saya akan berharap rmdan / atau find --deletemenjadi efisien. Poin menarik tentang menghapus dalam urutan untuk menghindari penyeimbangan b-tree saat menghapus. Tidak yakin berapa banyak dari itu berlaku untuk sistem file lain. XFS juga tidak hebat dengan jutaan file per direktori. IDK tentang BTRFS, tapi saya mendapat kesan bahwa itu mungkin baik untuk hal semacam itu.
Peter Cordes
Tidakkah kutipan kedua bergantung pada jenis sistem file ...
Menasheh
@Menasheh Poin bagus, saya mengedit jawaban saya.
Hitechcomputergeek
3

Satu hal yang dapat Anda lakukan adalah memulai rmproses di latar belakang (tanpa output, sehingga tidak akan melambat) dan kemudian, pantau di latar depan dengan perintah (a) sederhana :

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> _

The find/wccombo bisa diganti dengan alat apapun dapat memberikan unit yang Anda inginkan.


(a) Yah, relatif sederhana, dibandingkan dengan, katakanlah, fisika nuklir, hipotesis Riemann, atau apa yang harus dibeli istri saya untuk Xmas :-)


sumber
0

Beberapa waktu yang lalu saya menulis sesuatu untuk mencetak tingkat bahwa garis dicetak. Anda dapat menjalankan rm -rfv | ./counterdan itu akan mencetak garis per detik / menit. Meskipun bukan kemajuan langsung, itu akan memberi Anda umpan balik pada tingkat kemajuan, mungkin rmmengembara ke sistem file jaringan atau serupa mungkin?

Tautan ke kode ada di sini:

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

Ed Neville
sumber