Datum der letzten Aktualisierung ändern
Ted
- perl
0 Cheatah0 Bernhard Peissl0 Klaus Mock0 Bernhard Peissl0 Ted
0 Michael Schröpl
Hi,
ich möchte das Datum der letzten Aktualisierung aller Dateien innerhalb eines Verzeichnisses per Perl-Script ändern.
Reicht es, diese Dateien in einer Schleife einfach zu öffnen und sofort wieder zu schließen?
Oder kann/muß ich innerhalb des stat() Befehls meine Lösung suchen?
Ted
Hi,
ich möchte das Datum der letzten Aktualisierung aller Dateien innerhalb eines Verzeichnisses per Perl-Script ändern.
uffa.
Reicht es, diese Dateien in einer Schleife einfach zu öffnen und sofort wieder zu schließen?
Ehrlich gesagt: keine Ahnung. Probier's aus.
Oder kann/muß ich innerhalb des stat() Befehls meine Lösung suchen?
stat ist nur lesend, damit kannst Du gar nichts erreichen. Es sträuben sich mir zwar die Haare, aber im Zweifel würde ich dazu tendieren, auf einem Unix-System mit touch zu arbeiten - siehe dazu
man touch
Funktioniert natürlich auf Windows nicht; aber ich bin mir nicht sicher, bei welcher Aktion auf _allen_ Systemen die Änderungszeit angepaßt wird. Falls ein schreibendes Öffnen alleine nicht hilft, tut es vielleicht ein print FILE '';
Vielleicht suchst Du bei http://www.cpan.org/ aber mal nach einem passenden File::*-Modul... :-)
Cheatah
Hi Ihr,
dank Euch allen,
ich werd mal testen, ob >> und wieder schließen geht, bzw. irgend einen unwichtigen nicht sichtbaren Stuß reinschreiben, wenn ichs noch schnell genug schaffe, berichte ich Euch vom Ergebnis.
Vorerst jedenfalls vielen Dank
Ted
Hi Ihr,
dank Euch allen,
ich werd mal testen, ob >> und wieder schließen geht, bzw. irgend einen unwichtigen nicht sichtbaren Stuß reinschreiben, wenn ichs noch schnell genug schaffe, berichte ich Euch vom Ergebnis.
Vorerst jedenfalls vielen Dank
Ted
Und nochmal ich,
ich hatte gerade mal 10 min., da konnt ichs testen.
Also mit anhängen issnich, da bleibt das Datum, also in eine Liste einlesen, Datei zum schreiben öffnen, zeileweise wieder rein damit, alles klar.
Muß dann nur noch zuvor Schreibrechte erteilen und diese nachher wieder wegnehmen, nachdem diese Datei neu geschrieben wurde.
Das wars.
Danke nochmal
Ted
Hi,
Also mit anhängen issnich, da bleibt das Datum,
auch wenn Du einen Leerstring anhängst?
also in eine Liste einlesen, Datei zum schreiben öffnen, zeileweise wieder rein damit, alles klar.
Boah. Extrem unperformant und riskant. Du solltest wirklich eine andere Lösung anstreben :-)
Cheatah
Hi,
Also mit anhängen issnich, da bleibt das Datum,
auch wenn Du einen Leerstring anhängst?
Jep!
also in eine Liste einlesen, Datei zum schreiben öffnen, zeileweise wieder rein damit, alles klar.
Boah. Extrem unperformant und riskant. Du solltest wirklich eine andere Lösung anstreben :-)
Performance ist in dem Fall egal. Riskant aber eher nicht.
Inwiefern aber ist das riskant?
Doch nur, wenn der Server bei der Arbeit abschmiert, oder?
Ted
Hi,
Also mit anhängen issnich, da bleibt das Datum,
auch wenn Du einen Leerstring anhängst?
Jep!
Mist. Ich frage mich jetzt, ob Perl das wegoptimiert, oder ob das tatsächlich das OS entscheidet.
also in eine Liste einlesen, Datei zum schreiben öffnen, zeileweise wieder rein damit, alles klar.
Boah. Extrem unperformant und riskant. Du solltest wirklich eine andere Lösung anstreben :-)
Performance ist in dem Fall egal. Riskant aber eher nicht.
Inwiefern aber ist das riskant?
Doch nur, wenn der Server bei der Arbeit abschmiert, oder?
Nope. Wenn jemand anders aus irgendwelchen Gründen die Datei in dem Moment auch schreibt - oder aus der zum Schreiben geöffneten Datei die (in dem Moment nicht vorhandenen!) Daten ausliest und später wieder zurückschreibt. Dann hast Du nämlich satte Datenverluste.
Um ein Dateiattribut zu ändern, solltest Du Dir eine Funktion suchen, die dies macht. Auf Unixen ist dies beispielsweise touch. Eine allgemeingültige Funktion kann ich Dir leider nicht bieten - aber noch mal der Hinweis, vielleicht wirst Du auf CPAN fündig.
Cheatah
Nope. Wenn jemand anders aus irgendwelchen Gründen die Datei in dem Moment auch schreibt - oder aus der zum Schreiben geöffneten Datei die (in dem Moment nicht vorhandenen!) Daten ausliest und später wieder zurückschreibt. Dann hast Du nämlich satte Datenverluste.
Es sind normal html-Dateien, das können wir also ausschließen.
Um ein Dateiattribut zu ändern, solltest Du Dir eine Funktion suchen, die dies macht. Auf Unixen ist dies beispielsweise touch. Eine allgemeingültige Funktion kann ich Dir leider nicht bieten - aber noch mal der Hinweis, vielleicht wirst Du auf CPAN fündig.
Cheatah
Hi Cheatah,
hm, ich kann das aber leider nicht, mit modulen, objekten oder klassen oder wie auch immer programmieren :-((
Ted
P.S.: Ich kümmere mich mal um touch :-)
Hi,
Es sind normal html-Dateien, das können wir also ausschließen.
gut. Wenn niemand schreibend darauf zugreift, bist Du da relativ sicher. Es ist trotzdem von hinten durch die Brust ins Auge.
hm, ich kann das aber leider nicht, mit modulen, objekten oder klassen oder wie auch immer programmieren :-((
Das solltest Du _unbedingt_ lernen! Perl ohne Module ist wie ein Porsche mit Trabbi-Motor.
Cheatah
Hi,
Es sind normal html-Dateien, das können wir also ausschließen.
gut. Wenn niemand schreibend darauf zugreift, bist Du da relativ sicher. Es ist trotzdem von hinten durch die Brust ins Auge.
hm, ich kann das aber leider nicht, mit modulen, objekten oder klassen oder wie auch immer programmieren :-((
Das solltest Du _unbedingt_ lernen! Perl ohne Module ist wie ein Porsche mit Trabbi-Motor.
Cheatah
Hi Cheatah,
ich muß mich mal dafür bedanken, daß Du die Lösung, die ja zweifelsfrei funtzte, nicht so ohne weiteres "aktzeptiert" hast (Du weißt, wa sich meine).
Über "touch" kommt man zu utime, hier nun die Lösung:
#!/usr/bin/perl
$now = time;
$pfad = 'test';
@fileliste = <$pfad/*.*>;
foreach $filename (@fileliste) { utime($now, $now , "$filename"); }
Das wars! Klasse!
Das mit den Perl-Modulen hab ich mir schon gedacht, nachdem ich letztlich das Perl-Kochbuch von amazon.de erhalten hatte, und nicht mehr viel verstand.
Hast Du ne deutschsprachige einführende Internetadresse für mich?
Ted
P.S.: Dank Dir, daß Du solange am Thread bleibst.
Hi,
ich muß mich mal dafür bedanken, daß Du die Lösung, die ja zweifelsfrei funtzte, nicht so ohne weiteres "aktzeptiert" hast (Du weißt, wa sich meine).
kein Problem.
Über "touch" kommt man zu utime, hier nun die Lösung:
[...]
Das wars! Klasse!
Und ich find's klasse, daß Du die (erfrischend kurze) Lösung hier postest :-) Machen leider nicht viele...
[Module]
Hast Du ne deutschsprachige einführende Internetadresse für mich?
Abgesehen von http://www.phy.uni-bayreuth.de/~btpa25/perl/perl_main.html kann ich Dir leider nichts deutschsprachiges bieten. Du solltest Dich aber allgemein daran gewöhnen, daß Dokumentationen auf Englisch sind - und Übersetzungen meist nicht wirklich richtig, weil schon interpretiert.
Ja, ich weiß, der Einstieg ist auf Deutsch leichter :-) aber schau Dir insbesondere auch perldoc perlmod sowie die Dokus zu den benutzten Modulen an.
Cheatah
Und ich find's klasse, daß Du die (erfrischend kurze) Lösung hier postest :-) Machen leider nicht viele...
Hm, die funktioniert aber leider nur, wenn ich das Skript in telnet aufrufe, nicht aber über den Browser.
Hast Du nen Schimmer, warum?
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print qq
<html><head><title>UTIME</title></head><body>;
$now = time;
$pfad = '/hastenichjesehn/htdocs/test';
@fileliste = <$pfad/*.*>;
foreach $filename (@fileliste) { utime($now, $now , "$filename");
print "$filename wurde upgedatet<br>";
}
print qq
</body></html>;
Debugging ohne telnet (weil ja keine Fehlermeldung kommt) find ich schwierig.
zu> [Module]:
Danke für den Link, den kenn ich. Vielleicht hol ich mir diesbzgl. mal ein Buch.
Tschö
Ted
Hi,
Und ich find's klasse, daß Du die (erfrischend kurze) Lösung hier postest :-) Machen leider nicht viele...
Hm, die funktioniert aber leider nur, wenn ich das Skript in telnet aufrufe, nicht aber über den Browser.
natürlich nicht, es war ja auch kein CGI-Script.
Hast Du nen Schimmer, warum?
HTTP-Header fehlte; im CGI-Kontext kannst Du Dir nicht sicher sein, in welchem Verzeichnis Du Dich befindest. Darum ist $pfad='test' eher ungünstig.
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
$pfad = '/hastenichjesehn/htdocs/test';
Na siehst Du :-)
@fileliste = <$pfad/*.*>;
Ich empfehle eigentlich immer den "sauberen" Weg über opendir/readdir/closedir bzw. wenn rekursiv über File::Find.
foreach $filename (@fileliste) { utime($now, $now , "$filename");
utime(...) or die "Fehler bei utime: $!";
Bei kritischen Aktionen aller Art solltest Du _immer_ den Fehlercode abfangen! Übrigens macht es sich auch ganz gut, wenn Du -w und strict benutzt:
#!/usr/bin/perl -w
use strict;
my $pfad = ...
Debugging ohne telnet (weil ja keine Fehlermeldung kommt) find ich schwierig.
Ganz Deine Meinung (wobei ich statt "telnet" lieber "Konsole" sagen würde; der lokale Rechner reicht ja schließlich meist auch). Wobei Du bei CGI die Fehlermeldungen im Error-Log des Servers findest, bzw. ggf. auch im Browser, wenn Du
use CGI::Carp 'fatalsToBrowser';
einsetzt.
Cheatah
Ich empfehle eigentlich immer den "sauberen" Weg über opendir/readdir/closedir bzw. wenn rekursiv über File::Find.
Das sollte ich in der Tat versuchen!
foreach $filename (@fileliste) { utime($now, $now , "$filename");
utime(...) or die "Fehler bei utime: $!";
Bei kritischen Aktionen aller Art solltest Du _immer_ den Fehlercode abfangen!
Jep, guter Tip!
Übrigens macht es sich auch ganz gut, wenn Du -w und strict benutzt:
#!/usr/bin/perl -w
use strict;
my $pfad = ...
-w kenn ich, aber use strict nicht: Werde mich schlau machen!
Debugging ohne telnet (weil ja keine Fehlermeldung kommt) find ich schwierig.
Ganz Deine Meinung (wobei ich statt "telnet" lieber "Konsole" sagen würde; der lokale Rechner reicht ja schließlich meist auch).
Genau die mein ich! Die Konsole. Da ich aber auch meinen lokalen Server per Telnet bedien, sag ich immer Telnet.
Wobei Du bei CGI die Fehlermeldungen im Error-Log des Servers findest, bzw. ggf. auch im Browser, wenn Du
use CGI::Carp 'fatalsToBrowser';
einsetzt.
Chetah, Du weißt ja, mit den (ja wie nennt man die eigentlich, Klassen, Objekte??? Keine Ahnung) noch nicht umgehen kann.
Thanx
Ted
Cheatah
hi ho
Das solltest Du _unbedingt_ lernen! Perl ohne Module ist wie ein Porsche mit Trabbi-Motor.
*kicher* na du solltest mal meinen trabbi mit porsche-motor sehen :-)
cua
n.d.p.
Hi,
Das solltest Du _unbedingt_ lernen! Perl ohne Module ist wie ein Porsche mit Trabbi-Motor.
*kicher* na du solltest mal meinen trabbi mit porsche-motor sehen :-)
die Windschutzscheibe ist gestern an mir vorbeigeflogen, der Auspuff lag heute Morgen im Straßengraben neben der Haltestelle Tullastraße. Und wo finde ich den Rest? ;-)
Cheatah, sich das einfach nur lebhaft vorgestellt habend ;-)
hi ho
die Windschutzscheibe ist gestern an mir vorbeigeflogen, der Auspuff lag heute Morgen im Straßengraben neben der Haltestelle Tullastraße. Und wo finde ich den Rest? ;-)
in der werkstatt, ich glau, ich bau den zweitakter wieder ein.... :-)
cua
n.d.p.
Hi!
Hier mal ein Auszug aus Learning Perl. Ich hoff nur ich hab alles richtig übersetzt ;-)
<learning perl>
Für jedes File gibt es 3 timestamps, eines für last access time, eins für jast modification time, und das letzte für last inode time!
Wenn du die ersten 2 änderst, wird das 3. automatisch mitgeändert. Von Hand kannst du es nicht ändern.
Das blöde daran ist, die werden im internal time-format gemessen, also die Anzahl der Sekunden nach Mitternacht des 1.1.1970 :-( d.h. muss heute irgendwo zw. 800 und 900 Mio. sein ;-)
Die Unix-Funktion utime() nimmt eine Liste der files als Parameter und gibt die Zahl der betroffenen Dateien zurück.
$atime = $mtime = 800_000_000;
utime($atime, $mtime, "file1", "file2");
</learning perl>
Das Problem ist nur, wie bekommt man die richtige Zeit für $atime und $mtime ??
Ich hoffe das hilft dir weiter ;-)
liebe Grüsse
Bernhard
Hallo,
Das Problem ist nur, wie bekommt man die richtige Zeit für $atime und $mtime ??
utime ist super, für die 'richtige' zeit hätte ich was anzubieten ;-)
utime(time,time,$file);
mach praktisch ein 'touch' auf die Datei
Grüße
Klaus
Hi Klaus!
»» utime(time,time,$file);
mach praktisch ein 'touch' auf die Datei
Ich habe eigentlich gemeint, wie man das aktuelle, das heutige Datum bekommt. Ich habe ja nur aus "Learning Perl" übersetzt, aber ich glaube das was du geschrieben hast kommt aufs gleiche raus wie das was ich geschrieben hab, wenn ich mich nicht irre ;-)
Ich hab ja keine Ahnung was utime macht ;-) Wollt euch ja bloss ein bissi helfen :-(
Allerdings hab ich keinen blassen Schimmer von Unix und weiss infolgedessen auch nicht was ein "touch" ist bzw. das mysteriöse "time" ?!?! Ist das eine Variable, eine Konstante, oder wieso wird die immer ohne $ oder @ oder % verwendet?
Ist mir schon öfters bei der localtime() Fkt.- untergekommen -ja, ich hab perldoc perlfunc gelesen (cheatah mitlesen!! -ist zwar erst ein Anfang, aber perlre kommt auch irgendwann noch dran) Werd aber nicht wirklich schlau daraus, und jetzt wo du es auch verwendest, und ich annehme dass su dich sicher besser auskennst als ich könntest du mir ja mal nen Tipp geben, was das für ein seltsames Konstrukt ist ;-)
lieb Grüße
Bernhard
Moin!
Ich hab ja keine Ahnung was utime macht ;-) Wollt euch ja bloss ein bissi helfen :-(
Allerdings hab ich keinen blassen Schimmer von Unix und weiss infolgedessen auch nicht was ein "touch" ist
touch ist ein Unix-Kommando (bzw. Kommandozeilenprogramm), welches eben diese Access- und Modification-Zeiten aendert. Und utime() ist die entsprechende Systemfunktion, die von Programmen aufgerufen werden kann (von dem touch-Programm wohl auch wird), und in Perl wurde diese Funktion auch abgebildet. Das jetzt ohne Gewaehr, ich reime mir das auch nur so zusammen, weil ich gerade keine manpages zur Verfuegung habe, wo ich das ueberpruefen kann. Lies da also besser nochmal nach.
bzw. das mysteriöse "time" ?!?! Ist das eine Variable, eine Konstante, oder wieso wird die immer ohne $ oder @ oder % verwendet?
Eine Perl-Funktion, die die aktuelle Zeit zurueckgibt. Und zwar in eben dieser Form - Sekunden seit 01.01.1970. Und immer in Greenwich Mean Time (GMT). Dieses Zeitformat ist also ueberhaupt nichts komisches, im Gegenteil, es ist die beste Methode, einen Zeitpunkt zu speichern, weil sich am leichtesten damit rechnen laesst, und deshalb wird es eigentlich ueberall verwendet, ausser in der Microsoft-Welt natuerlich.
Nur zum Anzeigen ist der Wert nicht geeignet, weil er einem Menschen wohl eher wenig sagt. Dafuer gibt es dann die Funktionen gmtime() und localtime(), die das umrechnen (siehe perlfunc). Umgekehrt geht das auch, dazu muss man das Modul Time::Local einbinden (ein Standard-Modul, muss also nicht extra installiert werden) und von dort timegm() bzw. timelocal() aufrufen.
Ist mir schon öfters bei der localtime() Fkt.- untergekommen -ja, ich hab perldoc perlfunc gelesen (cheatah mitlesen!! -ist zwar erst ein Anfang, aber perlre kommt auch irgendwann noch dran) Werd aber nicht wirklich schlau daraus, und jetzt wo du es auch verwendest, und ich annehme dass su dich sicher besser auskennst als ich könntest du mir ja mal nen Tipp geben, was das für ein seltsames Konstrukt ist ;-)
Weiss nich, ob jetzt noch Fragen offen sind. Zu erwaehnen ist vielleicht noch, dass gm/localtime() automatisch time() aufrufen, wenn Du ihnen keinen Wert uebergibst. localtime() ist also gleichbedeutend mit localtime(time()) und gibt die aktuelle Zeit aus, waehrend "print scalar localtime(50000000);" den "Mon Aug 2 18:53:20 1971" ausgibt.
HTH && So long
Hi!
bzw. das mysteriöse "time" ?!?! Ist das eine Variable, eine
Konstante, oder wieso wird die immer ohne $ oder @ oder %
verwendet?
Eine Perl-Funktion, die die aktuelle Zeit zurueckgibt.
[...]
Zu erwaehnen ist vielleicht noch, dass gm/localtime() automatisch
time() aufrufen, wenn Du ihnen keinen Wert uebergibst. localtime()
ist also gleichbedeutend mit localtime(time()) und gibt die
aktuelle Zeit aus
Jetzt hats klick gemacht, danke!
liebe Grüsse
Bernhard
Hallo,
Das Problem ist nur, wie bekommt man die richtige Zeit für $atime und $mtime ??
utime ist super, für die 'richtige' zeit hätte ich was anzubieten ;-)
»» utime(time,time,$file);
mach praktisch ein 'touch' auf die Datei
Grüße
Klaus
Hi Klaus,
sorry, ich komme mit dieser Art von Foren wohl nicht zurecht, ich schau immer nur ans Ende des Threads, daher habe ich Deine Hilfe übersehen, und mußte mit dasselbe müsahm herraussuchen.
Du hast völlig recht, die funktion utime ist des Rätzels Lösung!!!
Danke Dir!!!!
Ted
Hi auch,
ich möchte das Datum der letzten Aktualisierung aller Dateien innerhalb eines Verzeichnisses per Perl-Script ändern.
Reicht es, diese Dateien in einer Schleife einfach zu öffnen und sofort wieder zu schließen?
wenn Du die Datei zum Lesen öffnest, dann aktualisierst Du sie nicht.
Öffnest Du sie zum Schreiben, dann löschst Du ihren Inhalt.
Ich würde also versuchen, sie zum Erweitern (">>$filename") zu öffnen - das könnte Deine Anforderung erfüllen.
mfG - Michael