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

directory chronologisch auslesen

Leser: 2


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
hudo
 2003-11-28 13:29
#73095 #73095
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hallo,


wie kann ich ein Directory "umgekehrt chronologisch" auslesen/in einem array ablegen, so dass der neuste Directory-Eintrag das erste Element des arrays ist.

Mit Unix waere das: ls -atl




Gruss
havi
 2003-11-28 13:39
#73096 #73096
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Hi!

Genauso, nur unter der Verwendung des Befehls system!

Gruss
hudo
 2003-11-28 13:48
#73097 #73097
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hm,

versteh ich nicht ganz.
ich kann mir grad nur sowas vorstellen:


system("echo ` ls -at |cat > ergebnisdatei`");

dann Inhalt von ergebnisdatei einlesen (und den Namen ergebnisdatei loeschen).

Aber unter Windows ???

Ich meine mein Problem das muesste ohne Hilfe von system() moeglich sein, indem schon beim einlesen irgendwie sortiert/geordnet wird:

opendir THISDIR, "$dirprefix" || die "geht nicht";
@allfiles = readdir THISDIR;
close THISDIR;

In der "opendir" Zeile muesste schon die Sortierung erfolgen....
havi
 2003-11-28 13:52
#73098 #73098
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Achso, Windows!!!
Hast du leider nicht angegeben!

Schau dir mal den dir Befehl an...

Gruss
pq
 2003-11-28 14:30
#73099 #73099
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@havi: wozu denn einen system-befehl ausführen? und überhaupt, mit system() kriegst du kein
ergebnis in ein array, wenn schon dann backticks. vielleicht einmal kurz ausprobieren, bevor du
postest!
und so geht es ganz ohne systembefehl:
Code: (dl )
1
2
3
opendir DIR, ".";
my @array = sort {-M $a <=> -M $b} readdir DIR;
closedir DIR;

ist doch gar nicht so schwer...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
havi
 2003-11-28 14:32
#73100 #73100
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Sorry, du hast recht!
Ich meinte backticks, aber deine Loesung ist natuerlich besser!!!

Gruss
Crian
 2003-11-28 14:46
#73101 #73101
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Ich kann mich gern nochmal wiederholen ^^

Quote
Ich würde zunächst die Dateien des Verzeichnisses einlesen (siehe perldoc -f opendir und perldoc -f readdir), dann den Status zu jeder Datei ermitteln (siehe perldoc -f stat) und dann eine entsprechende Vergleichsfunktion fürs Sortieren schreiben und mit deren Hilfe die Dateien sortieren (siehe perldoc -f sort).

Denk dran, dass Du dann beide Arrays sortieren musst, insofern Du keinen AoH genommen hast, um Dateinamen und Änderungszeitpunkt beisammen zu halten.

Falls Dir diese Tipps nicht reichen sag Bescheid, dann mach ich ein kleines Programm daraus.


Man vergleiche diese Diskussion ...\n\n

<!--EDIT|Crian|1070023696-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
hudo
 2003-11-28 14:53
#73102 #73102
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hi,

Ja genau sowas aehnliches meinte ich. Danke.

Es gibt nur noch zwei Probleme:

1: Fehlermeldung (fuer jeden Eintrag im Array)

Use of uninitialized value in numeric comparison (<=>) at ./ordner_3.pl line 32.

Hier der Quellcode:

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
53
54
55
#!/usr/bin/perl -w

use strict;
use warnings;
use Tk;

use File::stat;


my $dirprefix="/home/ich";

my $mw = MainWindow->new();

my $liste = $mw->ScrlListbox ( -label=>"Listen-Ausgabe" ,-background=>"grey"
,-relief=>"sunken" )->pack();

my $exitButton = $mw->Button( -text=>"Exit", -command=>"exit")->pack();
my $einleseButton = $mw->Button( -text=>"Einlesen" ,-command=>\&fill_in)->pack();


MainLoop;


sub fill_in {

my $elem;
my @allfiles;
my $sb;


opendir DIR, $dirprefix;
@allfiles = sort { -M $a <=> -M $b} readdir DIR; ### hier ist Zeile 32 !!!!!
closedir DIR;

#foreach $elem (@allfiles) {
# $sb = stat($elem);
# printf "File %s \t mtime %s\n", $elem, $sb->size;
#}


$liste->delete(0,"end");

foreach $elem (@allfiles) {
#if ( $elem =~ /\.html/ ) {



$liste->insert("end",$elem);
#print "$elem\n";
#}
}



}## fill_in


Die Ergebnisliste ist schon richtig sortiert, aber es gibt immer die fehlermeldung.

Wo liegt das Problem ?? Gibts da Abhilfe ??

Ein typischer Filename waere:
dddd-0-63----Hobby 600 Festbett---Teilintegrierter---EZ[0486]---preis[11.900]---km[140.000]---id=11111111129267353---.html

2: was bedeutet -M in der sort-Anweisung ??


Gruss
pq
 2003-11-28 14:56
#73103 #73103
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
opendir DIR, $dirprefix;
@allfiles =  sort { -M "$dirprefix/$a" <=> -M "$dirprefix/$b"} readdir DIR;
closedir DIR;

ist dch klar, readdir liefert die dateinamen ohne verzeichnis zurück.
-M() gibt dir die zeit seit der letzten änderung einer datei zurück.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
hudo
 2003-11-28 15:04
#73104 #73104
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Herzlichen Dank,


aber wo in welcher Doku steht das mit -M ?????

gruss
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2003-11-28 13:29.