Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1278[/thread]

Verzeichnisbaum rekursiv auslesen: Liste der Dateien eines Verzeichnisbaums

Leser: 19


<< >> 8 Einträge, 1 Seite
Cu8e
 2006-03-07 13:47
#11763 #11763
User since
2006-03-07
7 Artikel
BenutzerIn
[default_avatar]
Hallo,

hoffe ihr könnt mir helfen. Ich bin ein völliger Newbie, was das Entwickeln mit Perl betrifft.

Ich habe folgendes Problem:
Ich lese eine selbst erstellte config.ini Datei aus. In dieser Datei sind Pfade definiert. Diese Pfade lege ich mir in einem Array ab. Jetzt will ich dieses Array an eine Routine übergeben, die mir folgendes Ergebnis liefern soll.
Ich brauche eine Liste aller Dateien, die sich ab den im Ini-File definierten Root-Verzeichnissen rekursiv befinden. Also irgendwas, was rekursiv durch den Verzeichnisbaum geht und und mir alle Dateien mit vollqualifiziertem Pfad (z.B.: C:\temp\test.txt) in ein Array schreibt. Dazu kommt noch die Bedingung, dass ich nur all die Dateien in der Liste/im Array haben will, deren letztes Änderungsdatum älter als z.B. 6 Wochen ist.


Kann mir da jemand behilflich sein? Gibt es da evtl. schon ein Package, welches genau diese Aufgabe bewältigen kann? Ich finde einfach nix.

Danke für Eure Hilfe!

Ciao Cu8e
renee
 2006-03-07 14:06
#11764 #11764
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, da gibt es CPAN:File::Find

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my @files;
my @dirs = ('C:\');

for my $dir(@dirs){
find(\&wanted,$dir);
}

sub wanted{
my $file = $File::Find::name;
push(@files,$file) if(-f $file and -M $file > 42);
}


(ungetestet)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Relais
 2006-03-07 14:07
#11765 #11765
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Cu8e,07.03.2006, 12:47]Ich finde einfach nix.[/quote]
Wie hast Du denn gesucht?

Schau doch mal nach CPAN:File::Find.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Cu8e
 2006-03-07 14:42
#11766 #11766
User since
2006-03-07
7 Artikel
BenutzerIn
[default_avatar]
Hey, vielen Dank. Das funktioniert wunderbar.
Cu8e
 2006-03-08 15:45
#11767 #11767
User since
2006-03-07
7 Artikel
BenutzerIn
[default_avatar]
Hi,

habe nochmal eine Frage.

Wie bekomme ich denn jetzt das gleiche Ergebnis, die gleiche Liste wie oben schon gewollt, aber mit dem Pfad erst ab dem Root-Suchverzeichnis?

Beispiel:
Sourcepfad = z.B.: C:\temp (ab hier wird gesucht)
Datei wird gefunden: z.B.: C:\temp\source\test.txt
Ergebnisliste = source\test.txt (will nur den basename und die davorstehenden subfolder's)

Kann mir dabei auch jemand helfen?

Danke!
Matze2.pl
 2014-10-30 16:49
#178024 #178024
User since
2014-10-30
23 Artikel
BenutzerIn
[default_avatar]
Hallo, Ich bin auch ein Anfänger im Perl scripten und ich brauch eure Hilfe.
Ich sitzte schon seid einigen Tagen an einem Script, dass unteranderem das Alter von Verzeichnissen ausgeben soll. Und zwar hab ich eine solche ordnerstruktur:
20/2013/bla/bla/bla/bla
20/2014/bla/bla/bla/bla
20/2015/bla/bla/bla/bla

21/2113/bla/bla/bla/bla
21/2114/bla/bla/bla/bla
21/2115/bla/bla/bla/bla

jetzt möchte ich das neueste Änderungsdatum der 4-Zahligen ordner haben.
dafür habe ich folgenden Code genommen:
Code (perl): (dl )
1
2
3
4
5
my @projekttiefe=glob("/var/lib/testverzeichnis/Projekte/Projektenummern/*/*/");
 foreach $filename(@projekttiefe)
{
$alter = -M "$filename";
$kurzalter = sprintf "%.0f",$alter;}

Problem dabei war das er nur in dem ersten Unterverzeichnis geguckt hat.
ich habe es mit Rekursiv auslesen versucht aber da gibt er mir alles Dateien aus.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
my @dirs = glob "/var/lib/testverzeichnis/Projekte/Projektenummern/*/*";

foreach $dir (@dirs)

{
print "$dir\n";

opendir (DIR, $dir);
{find(\&wanted,$dir);
}

sub wanted
{
 my $file = $File::Find::name;
  push(@files,$file) if(-f $file and -M $file > 0);

}
 closedir (DIR);
foreach $files (@files)
{
print "$files\n";
}
}

kann mir jemand helfen? (ich weiß blöd ausgedrückt :/
Last edited: 2014-10-30 16:54:58 +0100 (CET)
Raubtier
 2014-10-30 17:11
#178025 #178025
User since
2012-05-04
1054 Artikel
BenutzerIn

user image
Ich verstehe dein Problem nicht so recht.

Code: (dl )
perl -E'say "$_: ". -M for grep {-d && /\/\d{4}$/} glob("/var/lib/testverzeichnis/Projekte/Projektenummern/*/*")'


sollte doch funktionieren?
Matze2.pl
 2014-10-31 15:56
#178035 #178035
User since
2014-10-30
23 Artikel
BenutzerIn
[default_avatar]
danke Raubtier,

hat super funktioniert. (ich muss leider Korrigieren).
die ausgabe hat zwar wudnerbar funktioniert, aber nach einigen tests stellte sich herraus das nicht immer das neueste Datum angezeigt wird.

das heißt wenn ich in einem Ordner (z.B./var/lib/testverzeichnis/Projekte/Projektenummern/12/1234) Unterodner habe und dort neue Dateien hinzufüge ändert sich die Zeitangabe leider nicht.
kann mir da jemand helfen?
Last edited: 2014-11-03 12:07:07 +0100 (CET)
<< >> 8 Einträge, 1 Seite



View all threads created 2006-03-07 13:47.