ftp -o - https://jcs.org/move_in | sh -
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

bin/progress: add utility to show progress of something reading a file

Evolved from https://twitter.com/jcs/status/1384703784899825665

+67
+67
bin/progress
··· 1 + #!/usr/bin/env ruby 2 + # 3 + # $ progress dump.sql.gz 4 + # gzip (68010): 56.13%, 27m52s left (1804580 bytes/sec) 5 + # 6 + 7 + if !(file = ARGV[0]) 8 + puts "usage: #{$0} <file>" 9 + exit 1 10 + end 11 + 12 + diffs = [] 13 + 14 + last_off = -1 15 + loop do 16 + fs = `fstat -o #{file}`.split("\n") 17 + if fs.count == 1 18 + puts "nothing has #{file} open" 19 + exit 1 20 + end 21 + fields = fs.last.split(" ") 22 + cmd = fields[1] 23 + pid = fields[2] 24 + size, off = fields[8].split(":") 25 + 26 + if off == "*" 27 + puts "no access to read status of pid #{pid}" 28 + exit 1 29 + end 30 + off = off.to_i 31 + 32 + if last_off > -1 33 + diffs.push (off - last_off) 34 + if diffs.count == 10 35 + diffs.shift 36 + end 37 + end 38 + last_off = off 39 + 40 + if diffs.any? 41 + avg = diffs.sum / diffs.count.to_f 42 + secs = ((size.to_i - off.to_i) / avg.to_f).floor 43 + rem = "" 44 + if secs > (60 * 60) 45 + h = (secs / (60 * 60).to_f).floor 46 + rem = "#{sprintf("%02d", h)}h" 47 + secs -= (h * 60 * 60) 48 + end 49 + if secs > 60 || rem.length > 0 50 + m = (secs / 60.0).floor 51 + rem += "#{sprintf("%02d", m)}m" 52 + secs -= (m * 60) 53 + end 54 + rem += "#{sprintf("%02d", secs)}s left" 55 + else 56 + avg = 0 57 + rem = "-" 58 + end 59 + 60 + perc = sprintf("%0.2f%%", (off / size.to_f) * 100.0) 61 + print "\r\e[K#{cmd} (#{pid}): #{perc}, #{rem} (#{avg.floor} bytes/sec)" 62 + 63 + sleep 1 64 + rescue Interrupt 65 + puts "" 66 + exit 67 + end