Hi ich möchte 2 Dateien vergleichen, und nur wenn die eine neuer ist als die andere soll etwas mit der Datei gemacht werden. Ist das irgendwie möglich ? Mit awk hatte ich es mal probiert, bin da aber nicht weit mit gekommen. Gibt es da nicht schon einen fertigen Befehl für ??? Danke schon mal für jeden Tip :-) -- SET THE CONTROLS FOR THE HEART OF THE SUN Jens
J.Strohschnitter wrote:
ich möchte 2 Dateien vergleichen, und nur wenn die eine neuer ist als die andere soll etwas mit der Datei gemacht werden. Ist das irgendwie möglich ? Mit awk hatte ich es mal probiert, bin da aber nicht weit mit gekommen. Gibt es da nicht schon einen fertigen Befehl für ???
Das riecht nach einem typischen Problem fuer "make". Anhand eines Makefiles, in dem Abhaen- gigkeiten zwischen Dateien oder Aktionen be- schrieben sind, wird anhand des Zeitstempels automatisch entschieden, ob etwas erledigt werden muss oder ob noch alles aktuell ist... Klingt etwas kryptisch, aber ohne naehere An- gaben, um was es Dir genau geht, kann man schwer eine wirklich geeignete Loesung suchen. Es gibt da einfach zu viele Problemloesungs- moeglichkeiten... Gruesse, Thomson -- Thomas Hertweck, Geophysicist Geophysical Institute, Karlsruhe University (TH)
Am Mittwoch, 16. April 2003 09:45 schrieb Thomas Hertweck:
J.Strohschnitter wrote:
ich möchte 2 Dateien vergleichen, und nur wenn die eine neuer ist als die andere soll etwas mit der Datei gemacht werden. Ist das irgendwie möglich ? Mit awk hatte ich es mal probiert, bin da aber nicht weit mit gekommen. Gibt es da nicht schon einen fertigen Befehl für ???
Das riecht nach einem typischen Problem fuer "make". Anhand eines Makefiles, in dem Abhaen- gigkeiten zwischen Dateien oder Aktionen be- schrieben sind, wird anhand des Zeitstempels automatisch entschieden, ob etwas erledigt werden muss oder ob noch alles aktuell ist... Klingt etwas kryptisch, aber ohne naehere An- gaben, um was es Dir genau geht, kann man schwer eine wirklich geeignete Loesung suchen. Es gibt da einfach zu viele Problemloesungs- moeglichkeiten...
Gruesse, Thomson
find kennt die optionen [a|c]newer (man find), damit sollte sich sowas einfach machen lassen -- Joerg Thuemmler sysadmin@vordruckleitverlag.de
Am Mittwoch, 16. April 2003 10:44 schrieb Joerg Thuemmler:
Am Mittwoch, 16. April 2003 09:45 schrieb Thomas Hertweck:
J.Strohschnitter wrote:
ich möchte 2 Dateien vergleichen, und nur wenn die eine neuer ist als die andere soll etwas mit der Datei gemacht werden. Ist das irgendwie möglich ? Mit awk hatte ich es mal probiert, bin da aber nicht weit mit gekommen. Gibt es da nicht schon einen fertigen Befehl für ???
Das riecht nach einem typischen Problem fuer "make". Anhand eines Makefiles, in dem Abhaen- gigkeiten zwischen Dateien oder Aktionen be- schrieben sind, wird anhand des Zeitstempels automatisch entschieden, ob etwas erledigt werden muss oder ob noch alles aktuell ist... Klingt etwas kryptisch, aber ohne naehere An- gaben, um was es Dir genau geht, kann man schwer eine wirklich geeignete Loesung suchen. Es gibt da einfach zu viele Problemloesungs- moeglichkeiten...
find kennt die optionen [a|c]newer (man find), damit sollte sich sowas einfach machen lassen
Hm, also ich lade aus dem Internet mittels wget Virensignaturen runter. Aber nur wenn die Datei die ich runterlade neuer ist, als die die ich bereits auf dem Filessystem liegt, soll die Datei auch an andere Server verteilt werden. Also z.B.: if [ File1 isNewer than File2 ] then cp xy /tmp else exit fi Ich wollte mittels awk das File-Datum in eine Variable speichern, aber das geht leider nicht, da awk nur einzelne Spalten Speichert, und nicht wie zB. Date="Apr 16". PS: Mit find klappt auch nicht. -- SET THE CONTROLS FOR THE HEART OF THE SUN Jens
J.Strohschnitter wrote:
also ich lade aus dem Internet mittels wget Virensignaturen runter. Aber nur wenn die Datei die ich runterlade neuer ist, als die die ich bereits auf dem Filessystem liegt, soll die Datei auch an andere Server verteilt werden. Also z.B.:
if [ File1 isNewer than File2 ] then cp xy /tmp else exit fi
man test, Vergleichskriterium -nt. Fuer Deinen Zweck ist "make" dann doch etwas mit Kanonen auf Spatzen geschossen ;-) Aber mit wget musst Du da IMHO ein bissl aufpassen: ich benutze es hier auch und erlebe, dass die Zeiten manchmal etwas seltsam sind nach dem Download. Mag aber auch am FTP-Server auf der Gegenseite liegen. Gruesse, Thomson -- Thomas Hertweck, Geophysicist Geophysical Institute, Karlsruhe University (TH)
Am Mittwoch, 16. April 2003 11:39 schrieb Thomas Hertweck:
J.Strohschnitter wrote:
also ich lade aus dem Internet mittels wget Virensignaturen runter. Aber nur wenn die Datei die ich runterlade neuer ist, als die die ich bereits auf dem Filessystem liegt, soll die Datei auch an andere Server verteilt werden. Also z.B.:
if [ File1 isNewer than File2 ] then cp xy /tmp else exit fi
man test, Vergleichskriterium -nt. Fuer Deinen Zweck ist "make" dann doch etwas mit Kanonen auf Spatzen geschossen ;-) Aber mit wget musst Du da IMHO ein bissl aufpassen: ich benutze es hier auch und erlebe, dass die Zeiten manchmal etwas seltsam sind nach dem Download. Mag aber auch am FTP-Server auf der Gegenseite liegen.
Perfekt! Genau das habe ich gesucht! Komisch im Linux in a nutshell gibt es die Option -nt gar nicht (jedenfalls nicht in der 99er Auflage). Danke an alle :-) -- SET THE CONTROLS FOR THE HEART OF THE SUN Jens
Hallo, On Wed, 16 Apr 2003, J.Strohschnitter wrote:
Am Mittwoch, 16. April 2003 11:39 schrieb Thomas Hertweck: [..]
man test, Vergleichskriterium -nt. [..] Perfekt! Genau das habe ich gesucht! Komisch im Linux in a nutshell gibt es die Option -nt gar nicht (jedenfalls nicht in der 99er Auflage).
Nur der Vollstaendigkeit halber, wie man in der shell diesen Test ebenfalls machen kann, falls man sowas mal braucht: if test $(( `date '+%s'` - `date -r DATEI '+%s'` )) -gt 86400; then Dieses Beispiel ueberprueft, ob DATEI aelter als ein Tag ist. Wichtig ist dabei, dass man eben durch das %s Format das (Datei-)datum in Sekunden bekommt, und mit diesen Integerwerten kann man dann weiterrechnen. Falls man ggfs. aus den Sekunden wieder ein Datum moechte, dann muss man (AFAIK) mehr oder weniger indirekt 'strftime' und 'gmtime' oder 'localtime' bemuehen. In perl z.B: $ perl -MPOSIX -e 'print strftime("%c\n", localtime(1000000000));' Son 09 Sep 2001 03:46:40 CEST -dnh -- I used to be a multiple personality, until we took a vote and decided we weren't. -- Stevo in the SDM
David Haller wrote:
if test $(( `date '+%s'` - `date -r DATEI '+%s'` )) -gt 86400; then
%s ist uebrigens ne GNU Erweiterung.
Falls man ggfs. aus den Sekunden wieder ein Datum moechte, dann muss man (AFAIK) mehr oder weniger indirekt 'strftime' und 'gmtime' oder 'localtime' bemuehen. In perl z.B:
$ perl -MPOSIX -e 'print strftime("%c\n", localtime(1000000000));' Son 09 Sep 2001 03:46:40 CEST
Huh, 'info "(sh-utils.info.gz)Examples of date"' spuckt eine kompaktere Methode aus. (Ok, David, bei dir vielleicht noch nicht.) Peter
Hallo, On Wed, 16 Apr 2003, Peter Wiersig wrote:
David Haller wrote:
if test $(( `date '+%s'` - `date -r DATEI '+%s'` )) -gt 86400; then
%s ist uebrigens ne GNU Erweiterung.
*ups* Aber verdammt praktisch ;) Zudem ich kein "stat" Befehl habe ;)
Falls man ggfs. aus den Sekunden wieder ein Datum moechte, dann muss man (AFAIK) mehr oder weniger indirekt 'strftime' und 'gmtime' oder 'localtime' bemuehen. In perl z.B:
$ perl -MPOSIX -e 'print strftime("%c\n", localtime(1000000000));' Son 09 Sep 2001 03:46:40 CEST
Huh, 'info "(sh-utils.info.gz)Examples of date"' spuckt eine kompaktere Methode aus.
Welche? Ich finde da jedenfalls nix...
(Ok, David, bei dir vielleicht noch nicht.)
Vermutlich ;( $ date --version date (GNU sh-utils) 1.16 -dnh -- PC's are designed by a committee of people who are in different companies in different countries and who never talk to each other. -- Derick Siddoway And nobody speaks the same language and they hate each other... -- Chris Adams
Hallo, On Wed, 16 Apr 2003, Peter Wiersig wrote:
David Haller wrote:
Welche? Ich finde da jedenfalls nix...
" To convert such an unwieldy number of seconds back to a more readable form, use a command like this:
date -d '1970-01-01 946684800 sec' +"%Y-%m-%d %T %z" 2000-01-01 00:00:00 +0000"
Merci. Das funktioniert bei mir auch, steht allerdings nicht im info. Finde ich aber doch etwas unpraktisch, das mit der Zeitangabe. Da ist mir mein C-Wrapper 'epochtodate'[1][2] um strftime dann doch lieber ;) -dnh [1] ja, bietet etwas mehr als ein simpler wrapper. [2] haengt im Moment aber noch von ein paar privaten lib-Funktionen ab, bei Interesse kann ich den privaten Kram aber so "expandieren", dass es kompatibel wird, und hier mailen oder online stellen ;) --
Naja spiele ich halt wieder Frisbee mit der NT CD. Funktioniert nicht. Stürzt immer ab. -- Hans Pueschel in dasr
* David Haller schrieb am 16.Apr.2003:
Nur der Vollstaendigkeit halber, wie man in der shell diesen Test ebenfalls machen kann, falls man sowas mal braucht:
if test $(( `date '+%s'` - `date -r DATEI '+%s'` )) -gt 86400; then
Dieses Beispiel ueberprueft, ob DATEI aelter als ein Tag ist. Wichtig ist dabei, dass man eben durch das %s Format das (Datei-)datum in Sekunden bekommt, und mit diesen Integerwerten kann man dann weiterrechnen.
Falls man ggfs. aus den Sekunden wieder ein Datum moechte, dann muss man (AFAIK) mehr oder weniger indirekt 'strftime' und 'gmtime' oder 'localtime' bemuehen. In perl z.B:
Geht auch mit der bash: date -d "1970-01-01 $SEC sec" Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
Hallo, On Thu, 17 Apr 2003, Bernd Brodesser wrote:
* David Haller schrieb am 16.Apr.2003: [date '+%s' o.ae.]
Falls man ggfs. aus den Sekunden wieder ein Datum moechte, dann muss man (AFAIK) mehr oder weniger indirekt 'strftime' und 'gmtime' oder 'localtime' bemuehen. In perl z.B:
Geht auch mit der bash:
s/der bash/date/;
date -d "1970-01-01 $SEC sec"
War mir neu. Und ja, diese Art das Datum anzugeben halte ich fuer, aehm, hoeflich gesagt, "suboptimal"... Nein, eigentlich will ich mir diese Krankeit auch gar nicht merken. epochtodate $SEC ist doch viel eleganter (siehe nebenan) *g* -dnh -- Das höhrt sich an, wie die Beschreibung eines Dildos für gewesene Jungfrauen. [WoKo in dafb]
On Don, 17 Apr 2003 at 04:11 (+0200), David Haller wrote:
On Thu, 17 Apr 2003, Bernd Brodesser wrote: [...]
date -d "1970-01-01 $SEC sec"
War mir neu. Und ja, diese Art das Datum anzugeben halte ich fuer, aehm, hoeflich gesagt, "suboptimal"... Nein, eigentlich will ich mir diese Krankeit auch gar nicht merken.
Wieso ist das krank? Du addierst zur Unix-Zeit 0 eine bestimmte Anahl Sekunden - einfache Addition (oder Subtraktion, klappt nämlich auch mit negativen Sekunden). Das finde ich durch und durch logisch.
epochtodate $SEC
jan@k500:~> man epochtodate Kein Manual-Eintrag für epochtodate vorhanden
ist doch viel eleganter (siehe nebenan) *g*
date gibts so auf jedem (halbwegs aktuellen ;-) Linux-System - Warum also seine Fähigkeiten nicht auch nutzen? Jan
Hallo, On Thu, 17 Apr 2003, Jan Trippler wrote:
On Don, 17 Apr 2003 at 04:11 (+0200), David Haller wrote:
On Thu, 17 Apr 2003, Bernd Brodesser wrote: [...]
date -d "1970-01-01 $SEC sec"
War mir neu. Und ja, diese Art das Datum anzugeben halte ich fuer, aehm, hoeflich gesagt, "suboptimal"... Nein, eigentlich will ich mir diese Krankeit auch gar nicht merken.
Wieso ist das krank? Du addierst zur Unix-Zeit 0 eine bestimmte Anahl Sekunden - einfache Addition (oder Subtraktion, klappt nämlich auch mit negativen Sekunden). Das finde ich durch und durch logisch.
Naja, ok, "krank" vielleicht nicht. Logisch ist's schon.
epochtodate $SEC
jan@k500:~> man epochtodate Kein Manual-Eintrag für epochtodate vorhanden
Gibbet auch nicht ;)
ist doch viel eleganter (siehe nebenan) *g*
date gibts so auf jedem (halbwegs aktuellen ;-) Linux-System - Warum also seine Fähigkeiten nicht auch nutzen?
Stimmt. Aber ich hab hier halt nun was praktischeres ;0 -dnh --
Meine fresse das 2te mal in 24 stunden. :(( Tip: Kürzere Tage verwenden. Das verringert die Chance, daß zwei Fehler auf einen Tag fallen. Wenn man sauber versagen will, kann man kann seine Fehler auch per cron erledigen lassen! [> Henne Vogelsang und Ratti in suse-linux]
Hallo zusammen,
also ich lade aus dem Internet mittels wget Virensignaturen runter. Aber nur wenn die Datei die ich runterlade neuer ist, als die die ich bereits auf dem >Filessystem liegt, soll die Datei auch an andere Server verteilt werden. Also z.B.:
if [ File1 isNewer than File2 ] then cp xy /tmp else exit fi
Ich wollte mittels awk das File-Datum in eine Variable speichern, aber das geht leider nicht, da awk nur einzelne Spalten Speichert, und nicht wie zB. >>>Date="Apr 16".
PS: Mit find klappt auch nicht.
Also wenn es dir nur um die patternfiles geht. Wget kennt die option -N (siehe man wget) fuer timestamping. Mit dieser option laedt wget das file nur herunter wenn es neuer ist als die lokale kopie. Bei -m ist der parameter ebenfalls enthalten (dann legt wget allerdings auch recursiv die verzeichnisse an.). Hab es gerade lokal mit einem internen webserver getestet. Funktioniert. Falls du dir mit datum und uhrzeit nicht sicher bist empfehle ich dir vor wget noch ntp zum zeitabgleich auszufuehren. Hoffe es hilft... Martin
* Joerg Thuemmler schrieb am 16.Apr.2003:
Am Mittwoch, 16. April 2003 09:45 schrieb Thomas Hertweck:
J.Strohschnitter wrote:
ich möchte 2 Dateien vergleichen, und nur wenn die eine neuer ist als die andere soll etwas mit der Datei gemacht werden. Ist das irgendwie möglich ? Mit awk hatte ich es mal probiert, bin da aber nicht weit mit gekommen. Gibt es da nicht schon einen fertigen Befehl für ???
Das riecht nach einem typischen Problem fuer "make". Anhand eines Makefiles, in dem Abhaen- gigkeiten zwischen Dateien oder Aktionen be- schrieben sind, wird anhand des Zeitstempels automatisch entschieden, ob etwas erledigt werden muss oder ob noch alles aktuell ist... Klingt etwas kryptisch, aber ohne naehere An- gaben, um was es Dir genau geht, kann man schwer eine wirklich geeignete Loesung suchen. Es gibt da einfach zu viele Problemloesungs- moeglichkeiten...
find kennt die optionen [a|c]newer (man find), damit sollte sich sowas einfach machen lassen
ACK. Aber so wie J.Strohschnitter es beschrieben hat, klingt es wirklich nach make, denn make macht genau das. Die Syntax des Makefiles ist so: Ziel: Quelle1 Quelle2 befehl1 befehl2 vor befehl steht ein TAB. Wenn einer der Quellen neuer ist als Ziel, oder Ziel nicht existiert, so werden die befehle ausgeführt. Normalerweise wird dabei Ziel erstellt, muß aber nicht. Natürlich müssen es nicht zwei Quellen sein, sondern können beliebig viele sein, auch gar keine, und ebenso können es beliebig viele Befehle sein, auch hier gar keine. Das war die Syntax für eine Regel. In einem Makefile können beliebig viele Regeln stehen. Wenn da die Quelle einer Regel als Ziel einer anderen auftaucht, dann wird zuerst diese Regel beachtet, wenn man das eigentliche Ziel haben möchte. Hier mal ein kleines Beispiel für ein Makefile, an dem man die Funktionsweise von make testen kann. Einfach in einem leeren Verzeichnis anlegen: ====Makefile================================================== all: foobar baz cat foobar baz > all echo all >> all foobar: foo bar foobar1 cat foo bar foobar1 > foobar echo foobar >> foobar foo: foo1 foobar1 foobar2 cat foo1 foobar1 foobar2 > foo echo foo >> foo bar: bar1 foobar2 cat bar1 foobar2 > bar echo bar >> bar baz: baz1 cat baz1 > baz echo baz >> baz clean: rm all foobar foo bar baz echo foobar1 > foobar1 echo foobar2 > foobar2 echo foo1 > foo1 echo bar1 > bar1 echo baz1 > baz1 ============================================================== Ein make clean legt die notwendigen Quelldateien neu an und löscht den Rest. Wenn man ein bestimmtes Ziel haben will, so muß man es dem make als Argument mitgeben, etwa make foo Wenn man make ohne Argument aufruft, so wird das erste Ziel genommen, hier all. Natürlich gibt es bei make auch Variablen und Spezialregeln und hast Du nicht gesehen. Aber man sollte erst mal obiges verstanden haben, bevor man damit anfängt. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12
participants (8)
-
B.Brodesser@t-online.de
-
David Haller
-
J.Strohschnitter
-
Jan.Trippler@t-online.de
-
Joerg Thuemmler
-
Martin Fink
-
Peter Wiersig
-
Thomas Hertweck