extcnt.pl

Eine kleine Spielerei, um festzustellen, mit welchen Dateitypen man sich grad seine Festplatte vollgemüllt hat:

`
############################################################
# extcnt.pl: Welche Dateitypen verbrauchen wieviel Plattenplatz?
############################################################
use strict;
use File::Find;

my $Bytes;
my %ExtSizes;

############################################################
# Ausgabe: Abschnittsüberschrift
############################################################
sub print_head
{
	print "-" x 46, "\n";
	print $_, "\n";
	printf("%-22s  %22s\n", "Dateiendung", "Bytes");
	print "-" x 46, "\n";
}

############################################################
# Ausgabe: Ergebnisliste
############################################################
sub print_body
{
	 for(sort { $ExtSizes{$a} <=> $ExtSizes{$b} } keys %ExtSizes)
	 {
		my $endung = $_;
		my $verbrauch = $ExtSizes{$_};
		printf("%-22s  %22s\n", $endung, $verbrauch);
	 }
}

############################################################
# Ausgabe: Ergebnisabschluss
############################################################
sub print_tail
{
	print "-" x 46, "\n";
	printf("%-22s  %22s\n\n", "Summe:", $Bytes);	
}

############################################################
# Dateiendung feststellen
############################################################
sub get_extension
{
	my $fileext = $_;
	
	if($_ =~ /\./)
	{
		# Juhu! Eine Datei mit .irgendwas dran.
		$fileext =~ s/.*\.([^.]*)$/$1/; 
		$fileext = lc($fileext);
	}
	else
	{
		# Irgendwas ohne gescheite Extension
		$fileext = 'Ohne Endung';
	}
}

############################################################
# Dateigroessen feststellen + in Ergebnisliste schreiben
############################################################
sub extcount
{
	unless (-f) 
	{
		# bei Verzeichnissen abbrechen 
		return
	}; 
	
    my $fileext = get_extension();
    	
	# Eigenschaften der gefundenen Datei auslesen
	my ($dev, $inode, $mode, $numlinks, $uid, $gid, $rdev, $size, $whatever)
	= stat($_) or return;

	$Bytes += $size;               # Gesamtverbrauch aller Dateien
	$ExtSizes{$fileext} += $size;  # Verbrauch fuer diese Endung
}

############################################################
# Hauptprogramm
############################################################
if ($#ARGV < 0) 
{
	die "Bitte mindestens einen Pfad angeben!\n";
}

for(@ARGV)
{	
	$Bytes=0;          # in jedem Verzeichnis bei 0 anfangen
	undef %ExtSizes;   # Leere Ergebnisliste

	chomp;	
	
	if(! -d) 
	{
		print "$_ wurde nicht gefunden oder ist kein Verzeichnis.\n\n";
		next;
	}
	
	find(\&extcount, $_);
	
	if($Bytes)
	{
    	print_head();
    	print_body();		
    	print_tail();
	}
}

############################################################
# EOF
############################################################
`

7 Gedanken zu „extcnt.pl

  1. Lustig, mein Comment ist zerschossen. Was ich eigentlich schreiben wollte, ist, dass sort eine dreiwertige Vergleichsfunktion erwartet, die -1, 0 oder 1 zurückgibt, je nachdem ob der linke Wert kleiner, gleich oder grösser als der rechte ist. wäre der entsprechende Operator für das, aber das kürzt deine Blogsoftware nun wohl wieder weg. :)

  2. Meinst du <=> (den „Ufo-Operator“)? – Danke, damit klappt es. :-)

    Wenn du im Blog etwas eingeben willst, was spitze Klammern enthält, musst du leider die entsprechenden HTML-Umschreibungen verwenden, also &lt;=&gt;. (Um das darstellen zu können musste ich wiederum &amp;lt;=&amp;gt; eingeben, wofür &amp;amp;lt;=&amp;amp;gt; erforderlich war, …)

  3. Soso :-) Eventuell würde es helfen, wenn du den Input dieser Textbox durch CGI::escapeHTML behandeln würdest (das Modul CGI ist eh vorinstalliert, eventuell muss es durch use CGI; geladen werden), also in etwa $input = CGI::escapeHTML($input);

  4. Ich werd ’nen Teufel tun. ;-) WordPress ist viel zu komplex, als dass ich da mal eben am Code pfuschen würde. Deinen Vorschlag hab ich ins Support-Forum geschrieben. Vielleicht wird er ja umgesetzt. Für’s erste kann man sich auch mit Backquotes behelfen: `< =>` Dummerweise haut WordPress jedesmal noch ein Leerzeichen dazwischen, aber immerhin kommt etwas lesbares dabei heraus.

  5. Super, dann spielen wir mal ein bisschen Perlgolf:

    sub get_extension
    {
    if (/\.([^\.]+)$/) {
    return $1;
    } else {
    return ‚Ohne Endung‘;
    }

    }

    Oder dann auch gleich als Einzeiler:
    sub get_extension {
    return /\.([^\.]+)$/ ? $1 : ‚Ohne Endung‘;
    }

  6. Jo, der Fragehaken-Operator ist mir auch aus LPC bekannt, und ich benutze ihn durchaus gern. Dass das $1 auch noch eine Anweisung weiter erhalten bleibt, wusste ich allerdings nicht. Wenn wir aber schon am Spielen sind:

    sub get_extension
    {
    return /\.([^\.]+)$/ ? lc($1) : ‚Ohne Endung‘;
    }

    Zumindest unter Wind*** halte ich das für sinnvoll.

Kommentare sind geschlossen.