Letzte datei im verzeichnis finden
Letzte datei im verzeichnis finden
am 01.03.2006 16:17:43 von Marcel Dix
Hallo!
Ich habe ein Verzeichnis mit den Dateien:
datei.1
datei.2
....
datei.24
....
datei.103
....
usw
Wie kann ich jetzt die letzte (also aktuellste) Datei herausfinden?
Bis jetzt hab ich das folgendermaßen gemacht:
my @files = glob("$dir/datei.*");
my $letztedatei = $files[-1];
gibts da noch andere möglichkeiten?
Endziel bei der ganzen Sache wäre dann die Dateien umzubenennen.
Mein bisheriger Versuch sieht so aus:
BTW: Ich beschäftige mich mit Perl noch nicht so lange
sub file_backup {
foreach my $item (@backupfiles) {
my @bup_files = glob("$gamedir/$item.*");
pop(@bup_files);
foreach my $files (@bup_files) {
my @path = split(/\//,$files);
my $len = scalar(@path);
my $name = $path[$len-1];
rename("$bup_files[-1]", "$gamedir$bupdir/$name")
}
}
}
Das funktioniert zwar, sieht für mich aber tierisch umständlich aus...
Bin für jede hilfe dankbar!
Bye
Marcel
Re: Letzte datei im verzeichnis finden
am 01.03.2006 19:58:18 von Guido Ostkamp
Marcel Dix wrote:
> Wie kann ich jetzt die letzte (also aktuellste) Datei herausfinden?
>
> Bis jetzt hab ich das folgendermaßen gemacht:
>
> my @files = glob("$dir/datei.*");
> my $letztedatei = $files[-1];
Das funktioniert ohnehin nicht, weil z.B. datei.11 vor datei.2
einsortiert wird, lediglich wenn Du immer gleiche Extension Formate
verwendest, also z.B. 3 Ziffern hinten ggf. mit führenden Nullen geht
es.
Außerdem muß die letzte Datei nicht die aktuellste sein; jede Datei
hat ein Modifikationsdatum, das entscheidet, welches die "aktuellste"
ist.
Für eine reine Perl-Implementation sieh Dir die Beschreibungen der
Funktione opendir, readdir, closedir und stat an, z.B. mit "perldoc -f
opendir" etc.
Gruß,
Guido
Re: Letzte datei im verzeichnis finden
am 01.03.2006 21:01:54 von Ch Lamprecht
Marcel Dix schrieb:
> Hallo!
>
> Ich habe ein Verzeichnis mit den Dateien:
>
> datei.1
> datei.2
> ....
> datei.24
> ....
> datei.103
> ....
> usw
>
> Wie kann ich jetzt die letzte (also aktuellste) Datei herausfinden?
>
> Bis jetzt hab ich das folgendermaßen gemacht:
>
> my @files = glob("$dir/datei.*");
> my $letztedatei = $files[-1];
>
> gibts da noch andere möglichkeiten?
>
>
> Bin für jede hilfe dankbar!
>
> Bye
> Marcel
Hallo Marcel,
schau doch mal perldoc File::Listing an.
Auch die anderen File:: - Module koennten dir die Arbeit erleichtern...
Grüße, Christoph
--
perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"
Re: Letzte datei im verzeichnis finden
am 02.03.2006 08:16:14 von Marcel Dix
Guido Ostkamp schrieb:
> Das funktioniert ohnehin nicht, weil z.B. datei.11 vor datei.2
> einsortiert wird, lediglich wenn Du immer gleiche Extension Formate
> verwendest, also z.B. 3 Ziffern hinten ggf. mit führenden Nullen geht
> es.
Hallo Guido!
Leider funktioniert es hier bei mir wunderbar. Also zuerst
1,2,3...11,12,13 usw. Ich wollte einfach nur wissen, ob es nicht noch
eine elegantere Methode gibt, die letzte Datei eines Verzeichnisses
herauszufinden...
> Außerdem muß die letzte Datei nicht die aktuellste sein; jede Datei
> hat ein Modifikationsdatum, das entscheidet, welches die "aktuellste"
> ist.
Ist aber in meinem Fall so. Die letzte Datei is die aktuellste.
Vielleicht hab ich mich auch ein wenig umständlich ausgedrückt...
Sagen wir so, ich möchte die Datei herausfinden, die die größte
Dateierweiterung besitzt.
Vielleicht jetzt besser :)
Bye
Marcel
Re: Letzte datei im verzeichnis finden
am 02.03.2006 09:46:45 von Frank Seitz
Marcel Dix wrote:
> Guido Ostkamp schrieb:
>>
>>Das funktioniert ohnehin nicht, weil z.B. datei.11 vor datei.2
>>einsortiert wird, lediglich wenn Du immer gleiche Extension Formate
>>verwendest, also z.B. 3 Ziffern hinten ggf. mit führenden Nullen geht
>>es.
>
> Leider funktioniert es hier bei mir wunderbar. Also zuerst
> 1,2,3...11,12,13 usw.
Da glob() lexikalisch sortiert, kann das eigentlich nicht sein.
Ich weiß allerdings nicht, ob das eine portable Eigenschaft ist,
unter Unix ist es jedenfalls so. D.h. mindestens da geht das so NICHT.
> Ich wollte einfach nur wissen, ob es nicht noch
> eine elegantere Methode gibt, die letzte Datei eines Verzeichnisses
> herauszufinden...
Wenn der Code trotz obiger Unkenrufe für Dich tut, was Du möchtest,
könntest Du ihn noch verkürzen zu:
$datei = (glob 'datei.*')[-1];
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Letzte datei im verzeichnis finden
am 03.03.2006 13:40:40 von Ingo Menger
Frank Seitz schrieb:
> Marcel Dix wrote:
> > Guido Ostkamp schrieb:
> >>
> >>Das funktioniert ohnehin nicht, weil z.B. datei.11 vor datei.2
> >>einsortiert wird, lediglich wenn Du immer gleiche Extension Formate
> >>verwendest, also z.B. 3 Ziffern hinten ggf. mit führenden Nullen geht
> >>es.
> >
> > Leider funktioniert es hier bei mir wunderbar. Also zuerst
> > 1,2,3...11,12,13 usw.
>
> Da glob() lexikalisch sortiert, kann das eigentlich nicht sein.
> Ich weiß allerdings nicht, ob das eine portable Eigenschaft ist,
> unter Unix ist es jedenfalls so. D.h. mindestens da geht das so NICHT.
perldoc sagt, daß glob so arbeitet wie /bin/sh es tun würde - und die
Standardshell sortiert. Wenn es also nicht sortiert, wäre was faul.
Re: Letzte datei im verzeichnis finden
am 03.03.2006 14:45:44 von Frank Seitz
Ingo Menger wrote:
> Frank Seitz schrieb:
>>Marcel Dix wrote:
>>>
>>>Leider funktioniert es hier bei mir wunderbar. Also zuerst
>>>1,2,3...11,12,13 usw.
>>
>>Da glob() lexikalisch sortiert, kann das eigentlich nicht sein.
>>Ich weiß allerdings nicht, ob das eine portable Eigenschaft ist,
>>unter Unix ist es jedenfalls so. D.h. mindestens da geht das so NICHT.
>
> perldoc sagt, daß glob so arbeitet wie /bin/sh es tun würde - und die
> Standardshell sortiert. Wenn es also nicht sortiert, wäre was faul.
Bei mir steht, dass glob() wie /bin/csh expandiert.
Leider steht da nicht, *wie* /hin/csh expandiert. Das wird
anscheinend als Allgemeinwissen vorausgesetzt.
Ich habe es gerade mal ausprobiert und siehe: Sie expandiert
tatsächlich, wie vom OP beschrieben!
> echo *
datei.1 datei.11 datei.2
Und die /bin/sh (Asche auf mein Haupt, ich nehme alles zurück),
verhält sich sogar genauso:
$ echo *
datei.1 datei.11 datei.2
Wow!
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Letzte datei im verzeichnis finden
am 03.03.2006 14:52:43 von Frank Seitz
Ingo Menger wrote:
> Frank Seitz schrieb:
>>Marcel Dix wrote:
>>>
>>>Leider funktioniert es hier bei mir wunderbar. Also zuerst
>>>1,2,3...11,12,13 usw.
>>
>>Da glob() lexikalisch sortiert, kann das eigentlich nicht sein.
>>Ich weiß allerdings nicht, ob das eine portable Eigenschaft ist,
>>unter Unix ist es jedenfalls so. D.h. mindestens da geht das so NICHT.
>
> perldoc sagt, daß glob so arbeitet wie /bin/sh es tun würde - und die
> Standardshell sortiert. Wenn es also nicht sortiert, wäre was faul.
Bei mir steht, dass glob() wie /bin/csh expandiert.
Leider steht da nicht, *wie* /hin/csh expandiert. Das wird
anscheinend als Allgemeinwissen vorausgesetzt.
Ich habe es gerade mal ausprobiert und siehe: Sie expandiert
tatsächlich, wie vom OP beschrieben!
> echo datei.*
datei.1 datei.11 datei.2
Und die /bin/sh (Asche auf mein Haupt, ich nehme alles zurück),
verhält sich sogar genauso:
$ echo datei.*
datei.1 datei.11 datei.2
Wow!
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Letzte datei im verzeichnis finden
am 03.03.2006 15:12:02 von Ingo Menger
Frank Seitz schrieb:
> Ingo Menger wrote:
> > Frank Seitz schrieb:
> >>Marcel Dix wrote:
> >>>
> >>>Leider funktioniert es hier bei mir wunderbar. Also zuerst
> >>>1,2,3...11,12,13 usw.
> >>
> >>Da glob() lexikalisch sortiert, kann das eigentlich nicht sein.
> >>Ich weiß allerdings nicht, ob das eine portable Eigenschaft ist,
> >>unter Unix ist es jedenfalls so. D.h. mindestens da geht das so NICHT.
> >
> > perldoc sagt, daß glob so arbeitet wie /bin/sh es tun würde - und d=
ie
> > Standardshell sortiert. Wenn es also nicht sortiert, wäre was faul.
>
> Bei mir steht, dass glob() wie /bin/csh expandiert.
Stimmt. Bei mir auch. Ich hatte nur bis standard shell gelesen und
nicht angenommen, daß jemand ausgerechnet im perl-Umfeld die csh damit
meinen könnte. Aber jetzt weiß ich wieder, warum ich glob() schon
immer gemieden habe wie der Teufel das Weihwasser.
> Leider steht da nicht, *wie* /hin/csh expandiert. Das wird
> anscheinend als Allgemeinwissen vorausgesetzt.
Natürlich, wenn es doch eine Standardshell ist! :)
> Ich habe es gerade mal ausprobiert und siehe: Sie expandiert
> tatsächlich, wie vom OP beschrieben!
>
> > echo *
> datei.1 datei.11 datei.2
>
> Und die /bin/sh (Asche auf mein Haupt, ich nehme alles zurück),
> verhält sich sogar genauso:
>
> $ echo *
> datei.1 datei.11 datei.2
Ganz normal also. Alphabetisch.
Das ist aber eben gerade *NICHT* so, wie vom OP beschrieben. Bei ihm
kommt ja die 11 angeblich erst nach der 2.
Du kannst die Asche also wieder wegkehren oder bürsten. Dein
Originaleinwand ist immer noch gültig, außer für die Perl-Version,
die der OP hat.
Re: Letzte datei im verzeichnis finden
am 03.03.2006 15:25:32 von Frank Seitz
Ingo Menger wrote:
> Frank Seitz schrieb:
>>
>>$ echo *
>>datei.1 datei.11 datei.2
>
> Ganz normal also. Alphabetisch.
> Das ist aber eben gerade *NICHT* so, wie vom OP beschrieben. Bei ihm
> kommt ja die 11 angeblich erst nach der 2.
Stimmt. Da hatte ich mich, ohne in die Postings nochmal
reinzugucken, falsch erinnert.
> Du kannst die Asche also wieder wegkehren oder bürsten. Dein
> Originaleinwand ist immer noch gültig, außer für die Perl-Version,
> die der OP hat.
Schade eigentlich. Irgendwie habe ich mir gewünscht,
dass der OP recht hat.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Letzte datei im verzeichnis finden
am 03.03.2006 15:41:14 von Christian Lackas
* Frank Seitz [2006-03-03]:
Hallo Frank,
> Bei mir steht, dass glob() wie /bin/csh expandiert.
> Leider steht da nicht, *wie* /hin/csh expandiert. Das wird
> anscheinend als Allgemeinwissen vorausgesetzt.
das steht dann in der man-page zu deiner csh(1). Bei uns (FreeBSD) ist
das die tcsh und dort heisst es im Abschnitt 'Filename substitution':
If a word contains any of the characters `*', `?', `[' or `{' or
begins with the character `~' it is a candidate for filename
substitution, also known as ``globbing''. This word is then
regarded as a pattern (``glob-pattern''), and replaced with an
alphabetically sorted list of file names which match the pattern.
Gruß
Chrisitan
--
Wenn Männer sich mit ihrem Kopf beschäftigen, nennt man das denken. Wenn
Frauen das gleiche tun, heißt das frisieren.
(Anna Magnani, ital. Schauspielerin, 1908-1973)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Letzte datei im verzeichnis finden
am 04.03.2006 08:29:26 von Frank Seitz
Christian Lackas wrote:
> * Frank Seitz [2006-03-03]:
>>
>>Bei mir steht, dass glob() wie /bin/csh expandiert.
>>Leider steht da nicht, *wie* /hin/csh expandiert. Das wird
>>anscheinend als Allgemeinwissen vorausgesetzt.
>
> das steht dann in der man-page zu deiner csh(1). Bei uns (FreeBSD) ist
> das die tcsh und dort heisst es im Abschnitt 'Filename substitution':
>
> If a word contains any of the characters `*', `?', `[' or `{' or
> begins with the character `~' it is a candidate for filename
> substitution, also known as ``globbing''. This word is then
> regarded as a pattern (``glob-pattern''), and replaced with an
> alphabetically sorted list of file names which match the pattern.
Wäre praktisch, wenn dies auch bei der glob()-Funktion dokumentiert wäre,
zumal der eigentlich interessante Teil zur Expansion sich noch über
mindestens 50 weitere Zeilen erstreckt. Ich schätze, aufgrund dieser
schlechten Informationslage wissen die wenigsten, was glob()
alles Tolles kann, wie u.a. Tilde-Expansion und Alternativen.
Die Gesamtnegation (^ am Anfang des Pattern), die auf der tcsh-Manpage
dokumentiert ist, scheint glob() allerdings nicht zu unterstützen,
ich erhalte statt Treffern eine leere Liste.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel