dfh und duh

  • Urspruenglicher Autor: Dirk Deimeke
  • Urspruengliches Datum: 24.06.2011

Da ich auf verschiedenen Unix- und Linux-Versionen unterwegs bin und gerade die Unix-Systeme den Parameter „-h“ (human-readable) bei df (disk free) und du (disk usage) nicht kennen, habe ich mir einen kleinen Wrapper in Perl geschrieben, um das einheitlich unter allen Systemen nutzen zu koennen.

Aufgerufen werden die Skripte mit duh x („x“ kann benutzt werden, muss aber nicht, dann gilt das aktuelle Verzeichnis, Wildcards sind auch möglich) und dfh x (Wildcards erlaubt, bei Weglassen wird die normale Ausgabe von df durchlaufen).

Grundlage der Skripte ist die Funktion to_human_readable, die aus einer Zahl das entsprechende Pendant in den Binaerpraefixen kibi, mebi, gibi, Tebi und pebi macht.

sub to_human_readable( $ ) {
	my ($number) = @\_;
	my @postfix = qw( k M G T P );
	my $post;
	my $divide = 1;
	foreach (@postfix) {
		$post = $_;
		last if (($number / ($divide * 1024)) < 1);
		$divide = $divide * 1024;
	}
	$number = int($number/$divide + 0.5);
	return $number . $post;
}

Dann sind da noch die beiden Funktionen trimlengthleft und trimlengthright, die links oder rechts Leerzeichen anfuegen, wenn die Laenge nicht erreicht ist bzw. den Text abschneiden, wenn die Laenge uerberschritten ist.

sub trimlengthright ( $$ ) {
	my ($txt, $len) = @\_;
	if ( length($txt) >= $len ) {
		$txt = substr($txt,0,$len - 1) . " ";
	} else {
		$txt = $txt . " " x ($len - length($txt));
	}
	return $txt;
}
sub trimlengthleft ( $$ ) {
	my ($txt, $len) = @\_;
	if ( length($txt) >= $len ) {
		$txt = substr($txt,0,$len - 1) . " ";
	} else {
		$txt = " " x ($len - length($txt)) . $txt;
	}
	return $txt;
}

Der Unterschied beider Skripte liegt an der Schleife, die durchlaufen wird, hier ist dfh:

#!/usr/bin/env perl -w
use strict;
my @line;
sub to_human_readable( $ ) {
	# wie oben
}
sub trimlengthright ( $$ ) {
	#wie oben
}
sub trimlengthleft ( $$ ) {
	# wie oben
}
open(DF,"df -k @ARGV |");
while (<DF>) {
	@line = split;
	next if $line[0] eq "Filesystem";
	print &trimlengthright($line[0],50); # filesystem
	print &trimlengthleft(&to_human_readable($line[1]),6); # total
	print &trimlengthleft(&to_human_readable($line[2]),6); # used
	print &trimlengthleft(&to_human_readable($line[3]),6); # free
	print &trimlengthleft($line[4],5); # used percent
	print " ",$line[5],"\n"; # mount point
}
close DF;

Und hier kommt duh:

#!/usr/bin/env perl -w
use strict;
my @line;
sub to_human_readable( $ ) {
	# wie oben
}
sub trimlengthright ( $$ ) {
	#wie oben
}
sub trimlengthleft ( $$ ) {
	# wie oben
}
open(DU,"du -ks @ARGV | sort -n |");
while (<DF>) {
	@line = split;
	print &trimlengthleft(&to_human_readable($line[0]),5)," "; # size
	print &trimlengthright($line[1],70),"\n"; # directory
}
close DU;

Zurück zur Uebersicht