From 32d31cd47b27215dd2fdb8272b0adb0b3b2f3892 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 10 May 2011 17:05:38 +0100 Subject: Add humanify. --- humanify | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ humanify.1 | 44 ++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100755 humanify create mode 100644 humanify.1 diff --git a/humanify b/humanify new file mode 100755 index 0000000..b7e69de --- /dev/null +++ b/humanify @@ -0,0 +1,91 @@ +#!/usr/bin/python +# Copyright 2011 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +import cliapp +import sys + + +class Humanify(cliapp.Application): + + iso_prefixes = [ + (1000**8, 'Y'), + (1000**7, 'Z'), + (1000**6, 'E'), + (1000**5, 'P'), + (1000**4, 'T'), + (1000**3, 'G'), + (1000**2, 'M'), + (1000, 'k'), + (1, ''), + ] + iec_prefixes = [ + (1024**8, 'Yi'), + (1024**7, 'Zi'), + (1024**6, 'Ei'), + (1024**5, 'Pi'), + (1024**4, 'Ti'), + (1024**3, 'Gi'), + (1024**2, 'MI'), + (1024, 'Ki'), + (1, ''), + ] + + def add_settings(self): + self.settings.add_boolean_setting(['binary', 'iec'], + 'use 10-based, not 2-based prefixes ' + '(ISO vs IEC)') + self.settings.add_boolean_setting(['bits'], + 'inputs give numbers of bits') + + def process_args(self, args): + self.units = self.determine_units() + + if args: + for arg in args: + self.humanify(arg) + else: + for line in sys.stdin: + self.humanify(float(line.strip())) + + def determine_units(self): + if self.settings['binary']: + prefixes = self.iec_prefixes + else: + prefixes = self.iso_prefixes + if self.settings['bits']: + suffix = 'b' + else: + suffix = 'B' + return [(factor, prefix + suffix) for factor, prefix in prefixes] + + def humanify(self, arg): + self.output.write('%s\n' % self._humanify(float(arg), self.units)) + + def _humanify(self, value, units): + assert units + if value >= units[0][0]: + return '%.0f %s' % (round(float(value) / units[0][0]), + units[0][1]) + for factor, unit in units: + size = float(value) / float(factor) + if 1 <= size < 1000: + return '%.0f %s' % (round(size), unit) + return '%.0f %s' % (round(float(value) / units[-1][0]), units[-1][1]) + + +if __name__ == '__main__': + Humanify().run() diff --git a/humanify.1 b/humanify.1 new file mode 100644 index 0000000..dcb80fb --- /dev/null +++ b/humanify.1 @@ -0,0 +1,44 @@ +.\" Copyright 2011 Lars Wirzenius +.\" +.\" This program is free software: you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation, either version 3 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program. If not, see . +.\" +.TH HUMANIFY 1 +.SH NAME +humanify \- format bit- and byte-sizes into human-readable form +.SH SYNOPSIS +.B humanify +.RB [ \-\-binary ] +.RI [ size ...] +.SH DESCRIPTION +.B humanify +formats in human-readable form data sizes (number of bits or bytes). +For example, +it can turn +.I 1234 +into +.I "1 kB" +or +.IR "1 KiB" . +Sizes are given on the command line, +or one-per line in the standard input. +Sizes are rounded to the nearest integer. +.SH OPTIONS +.TP +.BR \-\-binary +Use 2-based prefixes (from IEC), +rather than 10-based ones (from ISO). +In other words, "kibibyte" instead of "kilobyte". +.TP +.BR \-\-bits +Inputs give number of bits, instead of bytes. -- cgit v1.2.1