Schrift
[thread]8236[/thread]

File::Find Verzeichnisstiefe

Leser: 5


<< >> 4 Einträge, 1 Seite
zipster
 2006-08-12 18:52
#68838 #68838
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Hi,

ich würde gern mit File::Find Ordnern suchen, aber so das er maximal einen Ornder in die tiefe geht.
Das heißt wenn ich in D:\Temp suche soll er maximal D:\Temp\test1\ finden und nicht D:\Temp\test1\test2\

Beim Ordnersuchen gehe ich so vor.
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
#! perl

use File::Find;

$eingabe = $ARGV[0];
while (!$eingabe){
print "Es wurde kein Verzeichnissname eingegeben. Bitte geben sie einen Verzeichnissname ein:\n";
$eingabe = <STDIN>;
chomp $eingabe;
}



my @files;

find(\&get_dir,$eingabe);

for my $file(@files){
print "$file\n";
}

sub get_dir{
push(@files,$File::Find::name) if(-d $File::Find::name);
}


Wie muss ich es anpassen das er nicht alle Ornder sondern nur maximal einen Unterordner findet?

Danke

Gruß
Seri aka Zipster
GwenDragon
 2006-08-12 23:49
#68839 #68839
User since
2005-01-17
14745 Artikel
Admin1
[Homepage]
user image
[quote=zipster,12.08.2006, 16:52]ich würde gern mit File::Find Ordnern suchen, aber so das er maximal einen Ornder in die tiefe geht.
Das heißt wenn ich in D:\Temp suche soll er maximal D:\Temp\test1\ finden und nicht D:\Temp\test1\test2\[/quote]
Ich nehme an so:
Code: (dl )
find({ bydepth => 1, wanted => \&get_dir }, $eingabe);
\n\n

<!--EDIT|GwenDragon|1155412257-->
Dubu
 2006-08-13 04:23
#68840 #68840
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das bydepth => 1 bewirkt nur, dass ein Verzeichnisname erst nach seinem Inhalt an die wanted-Funktion übergeben wird (also erst "D:\Temp\test1\test2", dann "D:\Temp\test1"). Trotzdem wird in größt möglicher Tiefe gesucht.

Das Problem lässt sich wahrscheinlich mit einer preprocess-Funktion für find() lösen, aber IMHO ist das viel zu kompliziert gedacht. Wenn du nur die Ordner in einem Verzeichnis willst, sind opendir()/readdir() oder das gute alte glob() viel effizienter:
Code: (dl )
my @subdirs = grep -d, glob "D:\Temp\*";

(Vorsicht wenn der angegebene Verzeichnispfad Leerzeichen enthält, dann muss man bsd_glob() aus File::Glob statt des Standard glob() nehmen.)
zipster
 2006-08-14 13:48
#68841 #68841
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
<< >> 4 Einträge, 1 Seite



View all threads created 2006-08-12 18:52.