Perl und Dateigröße ermitteln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rall0r
Beiträge: 123
Registriert: 20.05.2005 09:33:48

Perl und Dateigröße ermitteln

Beitrag von rall0r » 18.11.2005 18:29:46

Guten Abend,
ich möchte gerne ein Skript in Perl basteln, welches anhand einer übergebenen Liste an Dateiendungen bestimmt, wieviele MByte in einem Verzeichnis durch Dateien mit dieser Endung belegt werden (inklusive Unterverzeichnisse).
Ich werde viele Probleme haben, dieses Skript zu erstellen :)
Aber eines, das mir am schwersten zu lösen scheint, ist das Größen-Problem.

Alternativ könnte ich mir vorstellen, einen String, wie er aus "ls -laR" entsteht, zu zerteilen, aber mir ist nicht klar, wie ich das mache, dass am ende nur die Dateigröße übrigbleibt. Mit awk ist das ja nicht so schwer, aber wie macht man das in Perl?

Ich bin für jede Hilfe dankbar!
Gruß,
Ralf
apt-get moo
wer denkt sich soetwas aus? :)

cyb
Beiträge: 75
Registriert: 06.08.2004 12:11:39
Wohnort: Dortmund

Beitrag von cyb » 18.11.2005 18:39:15

Also ich würd das ja eher mit bash machen.

"du" ist da ein sehr schöner befehl. Der die grösse bestimmen kann.

Wenns Perl sein muss, kannst du noch den perl befehl "system" nehmen.

rall0r
Beiträge: 123
Registriert: 20.05.2005 09:33:48

Beitrag von rall0r » 18.11.2005 20:06:06

Hallo,
das mit du ist schon klar. Nur möchte ich ja die Dateitypen und deren Platzverbrauch mit aufgelistet haben. Also in etwa:

Zip: 12345 Mbyte
Mp3: 5 MByte
etc.

das geht mit awk ja ganz gut, wenn man

Code: Alles auswählen

ls -alkR | awk '/^-.*\.[zZ][iI][pP]$/ {zip+=$5} END {printf "zip: %.0f Mbyte\n",zip/1024}'
benutzt, um z.B. den Speicherverbrauch von zip-Dateien zu ermitteln.
Nun hätte ich das aber ganz gerne etwas modularer, mit unterschiedlichen Dateitypen etc.
Gruß,
Ralf
apt-get moo
wer denkt sich soetwas aus? :)

Benutzeravatar
jack herer
Beiträge: 94
Registriert: 28.07.2003 19:48:17

Beitrag von jack herer » 18.11.2005 20:12:40

Hallo,

in Perl gibts den Operator -s für Dateigrößen, also z.B.:

Code: Alles auswählen

my @file_list = qw(a.txt b.txt c.txt);

my $size = 0;
foreach my $file (@file_list)
{
  $size += -s $file;
}

print "Total Size: $size\n";

Benutzeravatar
jack herer
Beiträge: 94
Registriert: 28.07.2003 19:48:17

Beitrag von jack herer » 18.11.2005 22:24:33

Zwar nicht besonders schön, funktioniert aber (für das aktuelle Verzeichnis)

Code: Alles auswählen

#!/usr/bin/perl -w

use IO::Dir;
use strict;

my $dir_name = $ENV{PWD};

my %dir_sizes;
my $dir = IO::Dir->new( $dir_name );
while (defined($_ = $dir->read))
{ 
  my $size = -s $_;
  next unless -f $_;
  if( $_ =~ /\.([^.]*)$/ )
  {
    $dir_sizes{$1} += $size;
  }
  else
  {
    $dir_sizes{WO_EXT} += $size;
  }
}
my $total_count = 0;
foreach my $key ( sort keys %dir_sizes )
{
  $total_count += $dir_sizes{$key};
  my ( $size, $extensions ) = getSize( $dir_sizes{$key} );
  print "$key $size $extensions\n";
}
my ( $size, $extensions ) = getSize( $total_count );
print "--------------------\nTOTAL: $size $extensions\n";

sub getSize
{
  my $size = shift(@_);
  my @extensions = qw(B KB MB GB);
  my $counter = 0;
  while( $size > 1024 )
  {
    $size /= 1024;
    $counter++;
  }
  return( $size, $extensions[$counter] );
}

rall0r
Beiträge: 123
Registriert: 20.05.2005 09:33:48

Beitrag von rall0r » 18.11.2005 22:29:57

Hi,
vielen Dank für die Mühen!
Ich werde es morgen mal ausprobieren.
Gruß und Guts Nächtle,
Ralf :)
apt-get moo
wer denkt sich soetwas aus? :)

Antworten