Thread Verzeichnisssuche mit einem Perlscript (4 answers)
Opened by Gast at 2007-05-12 17:04

PerlProfi
 2007-05-13 00:53
#76658 #76658
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Also das Modul File::Find::Rule kenne ich nicht, aber ich würde das mit opendir() anstelle des Systemaufrufs und File::Find erledigen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl -w
use strict;
use File::Find;

# startverzeichnis holen
my $dir = shift() || '.';
print "Search in $dir...\n";

my $max = 8; # laenge des laengsten verzeichnisses

# startverzeichnis oeffnen
opendir(my$hDIR, $dir)
or die "Can't open directory '$dir': $!";

# unterverzeichnisse einlesen
my @content = grep {
# vollstaendigen pfad besorgen
my $f = "$dir/$_";

# auf verzeichnis pruefen ( . und .. auslassen )
if (-d $f && !/^\.\.?$/) {
# max. laenge eventuell neu setzen
$max = length($f) if length($f) > $max; 1
}
} readdir($hDIR);

# startverzeichnis schliessen
closedir($hDIR);

# durch die unterverzeichnisse iterieren
foreach my$item (@content) {
# variablen initialisieren
my($path, $size, $files, $folders) = ("$dir\/$item", 0, 0, 0);

# groesse, anzahl dateien und anzahl ordner ermitteln
find(sub { -f && ++$files; -d && !/^\.\.?$/ && ++$folders; $size += -s }, $path);

# groesse auf MB bringen
$size /= 1024**2;

# groesse in 2 stuecke aufteilen
my $s1 = int($size);
my $s2 = $size-$s1;
if (length($s2) > 2)
{ substr($s2, 0, 2) = '' }
else
{ $s2 = 0 }

# ausgabe
printf '%-'.$max.'s Size: %4d.%08.8sMb Files: %4d Folders: %4d %4s'."\n"
=> $path, $s1, $s2, $files, $folders, $size < 1 ? '<1MB' : '';
}

Leider ist mir gerade nicht mehr eingefallen wie man in einem Format definieren kann, dass ein float eine Konstante Länge vor dem Komma, sowie nach dem Komma besitzt, daher habe ich die Verzeichnisgröße aufgeteilt.
$max ist neben $s1 und $s2 auch nur für die hübsche Ausgabe zuständig.

MfG

edit: in der ausgabe ein überflüssiges $max entfernt und '.' als default verzeichnis festgelegt\n\n

<!--EDIT|PerlProfi|1179003473-->

View full thread Verzeichnisssuche mit einem Perlscript