Linux find command - show progress


24

Saya bertanya-tanya apakah ada cara untuk menampilkan semacam info kemajuan saat mencari file di linux menggunakan find. Saya sering menemukan diri saya mencari file pada disk besar dan beberapa jenis indikator kemajuan akan sangat membantu, seperti bar atau setidaknya direktori saat ini "menemukan" pencarian. Apakah ada skrip yang melakukan itu, atau memang findmendukung beberapa kait ?


terima kasih atas jawabannya, saya akan memeriksa semua solusi dan memutuskan mana yang lebih baik. Jika terserah saya, saya akan menandai semua jawaban yang diterima.
Vlad Balmos

tergantung pada kriteria pencarian mana yang Anda gunakan untuk menemukan jauh lebih cepat daripada menemukan
B14D3

Jawaban:


28

dengan trik ini Anda dapat melihat folder saat ini - tetapi tidak ada bilah kemajuan - maaf.

 watch readlink -f /proc/$(pidof find)/cwd

itu keren. Perlu dicatat bahwa Anda membutuhkan hak pengguna super untuk mengakses cwd. Terima kasih!
Vlad Balmos

Bekerja dengan sempurna.
Jesse Glick

8

Utilitas kecil yang disebut pv (penampil pipa) dapat membantu. Dari ringkasan fantastis oleh Peteris Krumins:

Pipe viewer adalah alat berbasis terminal untuk memantau kemajuan data melalui pipa.

Anda dapat menggunakan pv dalam beberapa cara. Ketika bermain-main di sini, saya meletakkannya segera setelah pipa untuk memantau kemajuan output yang dihasilkan oleh find (harus melewati stdin ke stdout tanpa tersentuh)

find / -mtime -1h | pv > /dev/null

yang akan menampilkan output sedikit seperti ini:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(Saya mengarahkan stdout ke / dev / null sehingga saya bisa melihat progress bar beraksi tanpa output terbang. Ini mungkin bukan maksud Anda dengan find, jadi sesuaikan dengan itu)

Jujur saya tidak yakin seberapa baik ini bekerja di alam liar. Untuk temuan "mahal" seperti yang ada di atas (melintasi dari root), tampaknya berfungsi cukup baik. Untuk perintah yang lebih sederhana di simpul yang lebih dalam di pohon direktori, pv gagal total. Perintah-perintah ini segera mengembalikan hasil, jadi bar kemajuan mungkin diperdebatkan di sini.

Bagaimanapun, mainkan dan lihat apakah ini bekerja sama sekali untuk apa yang Anda butuhkan. Makanan untuk dipikirkan, setidaknya.


Apa yang akan ditampilkan oleh progress bar? Baik find, maupun pvtahu berapa lama pencarian akan berlangsung, sehingga mereka tidak dapat menghitung persentase. Yang bisa kita lihat di pvoutput adalah waktu sejak pencarian dimulai.
minaev

Ini benar. Saya pikir ada beberapa keajaiban yang terjadi, di suatu tempat, yang memungkinkan pv untuk memeriksa kemajuan direktori traversal (yang tidak benar). Diberikan input standar pada kecepatan konstan, pv hanya memindahkan progress bar pada frekuensi konstan. Coba yes | pv > /dev/nullamati
tcdyl

1
+1 untuk utilitas yang bagus
Vlad Balmos

Menilai kemajuan bukanlah hal yang sepele. Bahkan browser web yang memuat halaman tidak dapat melakukannya. Saya kira untuk isi file Anda dapat membaginya dengan ukuran file, tetapi untuk Unix stream Anda tidak tahu jumlah total data biasanya, dan alat ini dimaksudkan untuk fleksibel untuk segala jenis aliran data, bukan hanya file.
Sridhar Sarnobat

7

Saya mencari ini hari ini dan tiba di sini melalui Google. Saya telah menemukan berjalan lama berjalan pada OS X dan ternyata, watchtidak ada di sana. Jadi, inilah solusi lain:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = daftar file yang terbuka
  • -Fn= cukup tunjukkan nama file / direktori (diawali dengan karakter 'n', lewati ini jika Anda lebih suka lsofoutput penuh
  • -a= beri tahu lsofuntuk menunjukkan hanya baris yang cocok dengan semua kriteria (secara default ini menunjukkan baris yang cocok dengan kriteria apa pun )
  • -c find= tampilkan file / direktori yang dibuka oleh proses bernama find(sebenarnya, proses yang namanya dimulai find, tetapi case-sensitive jadi Findertidak akan muncul)
  • -d cwd = tunjukkan baris dengan FD (diarsipkan) cwd (direktori kerja saat ini)
  • +r 10 = tampilkan keluaran setiap 10 detik sampai tidak ada file terbuka ditemukan (cari selesai)

Ini akan menunjukkan direktori findsedang memproses setiap 10 detik, sehingga harus memberikan gambaran apakah findmasih berfungsi dan sejauh mana kemajuannya.


5

Ada contoh pencarian paralel dengan finddi man find. Dengan menggunakannya, Anda dapat melakukan beberapa pemeriksaan untuk setiap item, melakukan beberapa tindakan tergantung pada kondisi mana yang berfungsi. Cek pertama mungkin, misalnya, sederhana -print, sehingga semua nama dicetak ke stdout. Pemeriksaan kedua akan melakukan apa yang Anda inginkan. Sesuatu seperti:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Jika pemeriksaan kedua juga menampilkan nama file, Anda dapat mengarahkan ulang salah satu dari mereka ke stderr menggunakan -fprint /dev/stderr.


Saya belum menguji ini, tetapi saya pikir ini adalah cara yang benar.
Rolf

2

AFAIK, tidak, dan mengimplementasikannya akan menjadi tidak penting.

... Hmm. Mungkin sebuah skrip berjalan find <target dir> -type dterlebih dahulu, menyimpan daftar dan kemudian mengulang setiap dir sebelum menjalankan find <list item> -maxdepth 1 <rest of find parameters>dalam untuk loop.

Perhatikan bahwa Anda melakukan perdagangan / signifikan / kehilangan kinerja dengan imbalan bisa melihat secara samar apa yang dilakukannya.


1

Ini adalah daftar file saat ini dibuka oleh find , jadi itu sama dengan apa yang ditemukan 'sekarang'.

Its ringan sebagai alamat permintaan hanya dari descriptos file yang digunakan oleh menemukan setiap detik dan tidak interfer di menemukan sendiri. Anda juga dapat melakukannya dengan program apa pun yang Anda inginkan.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

The grep -v /dev/adalah untuk menyembunyikan file STDOUT, STDIN dan STDERR bahwa adalah file yang digunakan untuk menerima dan mencetak data pada konsol Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.