Thread Perl Verzeichnisse durchsuchen (27 answers)
Opened by Jens at 2011-06-03 11:14

pktm
 2011-06-03 13:14
#149391 #149391
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Da habe ich mir mal vor ewigen Zeiten etwas aus dem Netz abgespeichert:
more (2.2kb):
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
my $dirname = '/home/user/files';
my @dirs = ($dirname);
sub subdirs {

my $dname = shift;
my $entry;

opendir(DIR, $dname) or die "Kann Verzeichnis $dname nicht oeffnen: $!";
foreach $entry (readdir(DIR)) { # Verzeichnis oeffnen

next if $entry =~ /^\.\.?$/; # Die Eintraege ".." (Eltern-Verzeichnis)
# und "." (Das Verzeichnis selbst) ueberspringen

if(-d "$dname/$entry") { # Wenn der Eintrag ein Verzeichnis ist...

push(@dirs, "$dname/$entry"); # Abspeichern
subdirs("$dname/$entry"); # Nun soll dieses Verzeichnis nach Verzeichnissen
# durchsucht werden

}

}
closedir(DIR);
}
subdirs($dirname); # subdir-Funktion aufrufen um Array zu erhalten.

_Alternativ_ zum Obigen und wesentlich kürzer wäre:
@dirs = grep { -d } glob("$dirname/*");

Nun kann man mit den Unterverzeichnissen arbeiten:
foreach my $subdir (@dirs) {

opendir(DIR, $subdir) or die "Kann Verzeichnis $subdir nicht oeffnen: $!";
foreach my $entry (readdir(DIR)) {

next if $entry !~ /^([a-zA-Z0-9\_\-]+)\.html?$/; # Bsp, um alle HTML-Dateien
# zu bearbeiten.

open(FILE, "$subdir/$entry") or die "Kann Datei nicht oeffnen: $!";
# Mach' nun was mit der Datei
close(FILE);

}
closedir(DIR);

}


Aber ich würde dir auch File::Find:Rule empfehlen, das ist echt cool. Einfach mal bei cpan reinschauen.
Hier die wahrscheinlich passende Passage für deine noch auskommentierten Tests:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
stat tests

The following stat based methods are provided:
dev, ino, mode, nlink, uid, gid, rdev, size, atime, mtime,
ctime, blksize, and blocks. See "stat" in perlfunc for details.

Each of these can take a number of targets, which will follow Number::Compare semantics.
$rule->size( 7 ); # exactly 7
$rule->size( ">7Ki" ); # larger than 7 * 1024 * 1024 bytes
$rule->size( ">=7" )
->size( "<=90" ); # between 7 and 90, inclusive
$rule->size( 7, 9, 42 ); # 7, 9 or 42


Ich habe da auch gerade File::Find::Rule::Age gesehen:
Code: (dl )
1
2
    use File::Find::Rule::Age;
my @old_files = find( file => age => [ older => '1M' ], in => '.' );
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread Perl Verzeichnisse durchsuchen