Leser: 35
my @raw_list = `ls -lR`;
Guest lsHm, also rsync hilft mir dabei leider nicht. Das erstellen dieser "Listen
absoluter Pfade" ist nur der erste Schritt, weitere sollten danach folgen.
Gut, aber kann ich mit File::Find ein Listing aehnlich wie mit ls erzeugen?
Ich habe jetzt noch was gelesen von readdir. Danke soweit. Mit welchem laest
sich am ehesten ein Listing von absoluten Pfaden erzeugen? Tipps?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my @lesen;
push @lesen,'/startpfad';
my %datei1;
local *VERZEICHNIS;
while (scalar @lesen) {
my $verz = shift @lesen;
opendir (VERZEICHNIS,$verz) or die $!;
foreach my $file (sort {$a cmp $b} readdir VERZEICHNIS) {
if ($file eq '.' || $file eq '..')
next; # Gleiches Ver. oder höher springen
}
elsif (-d "$verz/$file") {
push @lesen,"$verz/$file"; next; # Verzeichnis gefunden
}
else {
$datei1{$verz}{$file} = defined; # Datei gefunden
}
}
}
if ($file eq '.' || $file eq '..')
my @files = grep { $_ !~ m/^\.{1,2}$/ } readdir($fhDir);
2009-09-28T13:51:27 havi... und immer Lexikalische Filehandles verwenden:
2009-09-28T13:56:27 pq2009-09-28T13:51:27 havi... und immer Lexikalische Filehandles verwenden:
da haben wir sogar nen wiki-artikel zu:
WasIsteinLexikalischerFileHandle
2009-09-28T14:53:32 LinuxerAnderer Vorteil ist, dass man sich keine Gedanken um den Namespace zu machen braucht (jedenfalls habe ich das so beim Überfliegen des Wiki-Artikels grad nicht gesehen).
Zwei Subroutinen im gleichen Namensraum, die als Handle INFILE benuzen, kommen sich gegenseitig in die Quere!
Zwei Subroutinen, die als Handle my $infile verwenden, können wunderbar im gleichen Namensraum nebeneinander existieren.
Siehe auch:
http://perldoc.perl.org/perlopentut.html#Indirect-...
2009-09-28T15:05:04 pqnein, aber wozu willst du local benutzen, wenn du ganz einfach und sauber lexikalische benutzen kannst?
barewords sind aus historischen gründen noch unterstützt und wegen der speziellen filehandles STDIN, STDOUT etc.
seit man filehandles in echten variablen haben kann, gibt es eigentlich keinen grund mehr, warum man barewords benutzen will (es sei denn, man benutzt eine steinzeit-perl-version, die die neuen filehandles noch nicht unterstützt).
es wurden jetzt eine menge vorteile genannt. jetzt würde mich mal interessieren, welche vorteile barewords deiner meinung haben, da du die hier sehr zu verteidigen scheinst =)
man kann sich natürlich auch modernem perl verschliessen, da es ja abwärtskompatibel ist, aber warum sollte man?
2009-09-28T15:06:13 pqda wir hier eine praktische baumstruktur haben, brauchst du nicht immer das komplette posting zu zitieren, das macht einen thread auch nur unnötig gross.
2009-09-28T13:36:43 biancaEs gibt sicher elegantere und schnellere Methoden z.B. mittels File::Find
Guest lsGut, aber kann ich mit File::Find ein Listing aehnlich wie mit ls erzeugen?
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#!/usr/bin/perl use strict; use warnings; use File::Find; # Erster Pfad (Ordner1) my $base_path_a='/home/topeg/test1/'; # Zweiter Pfad (Ordner2) my $base_path_b='/home/topeg/test2/'; # hash für alle Pfad/Dateinamen my %files; # Ordner 1 durchsuchen alle gefunden Dateien +=1 find(sub{found(1,$base_path_a)}, $base_path_a); # Ordner 2 durchsuchen alle gefunden Dateien -=1 find(sub{found(-1,$base_path_b)}, $base_path_b); # wenn der Wert =-1 dann ist die Datei zwar in Ordner2 aber nicht in Ordner1 print "nur in $base_path_b :\n "; print join("\n ", sort map{$files{$_}{path}}grep{ $files{$_}{exists}<0 }keys(%files)); print "\n","#"x80,"\n"; # wenn der Wert =1 dann ist die Datei zwar in Ordner1 aber nicht in Ordner2 print "nur in $base_path_a :\n "; print join("\n ", sort map{$files{$_}{path}}grep{ $files{$_}{exists}>0}keys(%files)); print "\n","#"x80,"\n"; # wenn der Wert =0 dann ist die Datei in Ordner1 und in Ordner2 print "existiert in $base_path_b und in $base_path_a :\n"; my @files=map{$files{$_}} sort grep{ $files{$_}{exists}==0}keys(%files); print " verändert in $base_path_b :\n"; for my $file (@files) { my @stat_a=stat($base_path_a.$file->{path}); my @stat_b=stat($base_path_b.$file->{path}); my $modification_time_a=$stat_a[9]; my $modification_time_b=$stat_b[9]; if($modification_time_a < $modification_time_b) { print " ".$file->{path}."\n"; } } print " verändert in $base_path_a :\n"; for my $file (@files) { my @stat_a=stat($base_path_a.$file->{path}); my @stat_b=stat($base_path_b.$file->{path}); my $modification_time_a=$stat_a[9]; my $modification_time_b=$stat_b[9]; if($modification_time_a > $modification_time_b) { print " ".$file->{path}."\n"; } } print " unverändert:\n"; for my $file (@files) { my @stat_a=stat($base_path_a.$file->{path}); my @stat_b=stat($base_path_b.$file->{path}); my $modification_time_a=$stat_a[9]; my $modification_time_b=$stat_b[9]; if($modification_time_a == $modification_time_b) { print " ".$file->{path}."\n"; } } print "#"x80,"\n"; ######################################################################## sub found { my $add=shift; my $base=shift; if(-f $File::Find::name) { # remove basepath (my $file=$File::Find::name)=~s/^$base//; if($file) { $files{$file}{path}=$file; $files{$file}{exists}+=$add; } } }