Datum auslesen und Zeitstempel aendern
Hallo,
ich habe wieder einmal ein kleines Problem.
Aus alten MS-Zeiten habe ich noch viele Doc-Dateien, die ich nun nach
und nach in Applix-Files umgewandelt habe. Leider (aber
logischerweise) zeigt mir ls nun das Datum an, an dem die aw-Dateien
angelegt wurden.
Da sich in den meisten Dateien ein Datum nach dem Muster dd.mm.yy
befindet, wuerde ich es nun gerne auslesen und das fuer diese Datei
von ls angezeigte Datum entsprechend aendern. Wenn es das Muster
dd.mm.yy nicht gibt, soll eine Fehlermeldung ausgegeben werden, damit
ich das Dateidatum von Hand aendern kann.
Zumindest mit Perl sollte das alles ja kein Problem sein, bloss habe
ich mich mit Perl noch nie beschaeftigt und weiss deshalb nicht
einmal, wo ich mit der Suche nach einer Loesung anfangen soll.
Probiert habe ich deshalb erst einmal mit awk. Ein
awk '/[0-9]\.[0-9]\.[0-9]/ {print $0}' *
bringt zwar ein paar Zeilen wie
"Heinz W. Pahlke" wrote:
[...] Probiert habe ich deshalb erst einmal mit awk. Ein
awk '/[0-9]\.[0-9]\.[0-9]/ {print $0}' *
bringt zwar ein paar Zeilen wie
aber wie erfahre ich nun, zu welcher Datei die Ausgabe jeweils gehoert, und wie pipe ich das Datum an touch fuer ein
touch -t YYYYMMDD0000 Datei
wobei der urspruengliche Dateiname erhalten bleiben sollte.
Siehe "man awk" und suche nach dem I/O Statements "system". Das benutzst Du statt "print". cu Anibal --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
On 31-Oct-2000 Anibal Vasquez wrote:
"Heinz W. Pahlke" wrote:
awk '/[0-9]\.[0-9]\.[0-9]/ {print $0}' *
bringt zwar ein paar Zeilen wie
aber wie erfahre ich nun, zu welcher Datei die Ausgabe jeweils gehoert, und wie pipe ich das Datum an touch fuer ein
touch -t YYYYMMDD0000 Datei
wobei der urspruengliche Dateiname erhalten bleiben sollte.
Siehe "man awk" und suche nach dem I/O Statements "system". Das benutzst Du statt "print".
Danke fuer diesen Tip, aber noch kann ich ihn nicht umsetzen,
einfach, weil ich aus der man-page nicht schlau werde. Ich kann zwar
nach "system" suchen, aber die Informationen sagen mir nichts.
Meinst Du unter I/O Statements den Passus:
"system(cmd-line) Execute the command cmd-line, and return the
exit status. (This may not be available on non-POSIX systems.)"?
Das print einfach nur durch system zu ersetzen, bringt jedenfalls
einen parse-error.
Eigentlich wuerde ich ja jetzt gerne weiter nach der Loesung
suchen, aber vorher muss ich leider erst einmal im Kinderzimmer
weiter renovieren. Solche Kleinigkeiten kommen eben auch immer noch
dazu.
Gruss,
Heinz.
--
E-Mail: Heinz W. Pahlke
"Heinz W. Pahlke" wrote:
Danke fuer diesen Tip, aber noch kann ich ihn nicht umsetzen, einfach, weil ich aus der man-page nicht schlau werde. Ich kann zwar nach "system" suchen, aber die Informationen sagen mir nichts.
Meinst Du unter I/O Statements den Passus:
"system(cmd-line) Execute the command cmd-line, and return the exit status. (This may not be available on non-POSIX systems.)"?
Genau
Das print einfach nur durch system zu ersetzen, bringt jedenfalls einen parse-error.
Du must schon eine Kommandozeile angeben (s.o. "cmd-line"). Das wäre in Deinem Falle so was wie "touch -t $0", falls akw "$0" als das vor Dir gewünschte Datum in dem von touch benötigten Format auflöst.
Eigentlich wuerde ich ja jetzt gerne weiter nach der Loesung suchen, aber vorher muss ich leider erst einmal im Kinderzimmer weiter renovieren. Solche Kleinigkeiten kommen eben auch immer noch dazu.
Ok, dann vielleicht für nachher :) Ich würde sowieso dafür nicht akw benutzen, sonder eine bash-for-Schleife, in der Du mit grep aus der Datei die Info holst, die Du brauchst, und dann an touch weitergibst. So eine Schleife bräuchtest Du mit akw wahrscheinlich so wie so. bash # cd verzeichnis_mit_ziel_dateien bash # for i in *;do touch -t `grep -e [0-9.] $i` $i;done Das wird so nicht funktionieren, weil "grep -e [0-9.] $i" wahrscheinlich nicht genau das zurückgibt, was touch erwartet. Must Du halt vor der Übergabe an touch bearbeiten. cu Anibal --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
On 31-Oct-2000 Anibal Vasquez wrote:
Du must schon eine Kommandozeile angeben (s.o. "cmd-line"). Das wäre in Deinem Falle so was wie "touch -t $0", falls akw "$0" als das vor Dir gewünschte Datum in dem von touch benötigten Format auflöst.
So ist das also zu verstehen! Aber leider liefert awk das Datum natuerlich in anderer Form.
Ich würde sowieso dafür nicht akw benutzen, sonder eine bash-for-Schleife, in der Du mit grep aus der Datei die Info holst,
die aber gleichfalls in einem fuer die direkte Uebergabe an touch ungeeigneten Format ausgegeben wird.
die Du brauchst, und dann an touch weitergibst. So eine Schleife bräuchtest Du mit akw wahrscheinlich so wie so.
Ja, ja, aber das Schleifenproblem wollte ich erst mal aufschieben, bis ich das andere geschafft habe. Sonst weiss die Schleife ja gar nicht, was sie eigentlich tun soll.
bash # cd verzeichnis_mit_ziel_dateien bash # for i in *;do touch -t `grep -e [0-9.] $i` $i;done
Das wird so nicht funktionieren, weil "grep -e [0-9.] $i" wahrscheinlich nicht genau das zurückgibt, was touch erwartet. Must Du halt vor der Übergabe an touch bearbeiten.
Du sprichst grosse Worte gelassen aus. Bis ich das geschafft habe,
wird wohl einige Zeit dauern, zumal ich inzwischen festgestellt habe,
dass das Datum in der Form DD.MM.YY, D.MM.YY, DD.M.YY, MM.YY und M.YY
vorliegen kann. Und da es in den Dateien auch noch andere
Zahlenangaben aehnlicher Struktur geben kann, darf immer nur das
jeweils erste Auftreten ausgewertet werden.
Jedenfalls vielen Dank fuer deine Hilfe, jetzt weiss ich erst einmal,
wie ich weitermachen kann.
Beste Gruesse,
Heinz.
--
E-Mail: Heinz W. Pahlke
"Heinz W. Pahlke" wrote:
On 31-Oct-2000 Anibal Vasquez wrote: [...]
bash # cd verzeichnis_mit_ziel_dateien bash # for i in *;do touch -t `grep -e [0-9.] $i` $i;done
Das wird so nicht funktionieren, weil "grep -e [0-9.] $i" wahrscheinlich nicht genau das zurückgibt, was touch erwartet. Must Du halt vor der Übergabe an touch bearbeiten.
Du sprichst grosse Worte gelassen aus. Bis ich das geschafft habe, wird wohl einige Zeit dauern,
Ich meine, zum Bearbeiten von Streams mit "sed" gab es in letzter Zeit einige Threads (zum Ändern von Datei_namen in DateiNamen, o.Ä). Vielleicht lohnt sich da ein Blick ins Archiv von SuSE.
zumal ich inzwischen festgestellt habe, dass das Datum in der Form DD.MM.YY, D.MM.YY, DD.M.YY, MM.YY und M.YY vorliegen kann.
Für touch ? Laut man touch muss das in der Form [[CC]YY]MMDDhhmm[.ss] liegen, also ohne ".", es sei denn zum Trennen der Sekundenangabe.
Und da es in den Dateien auch noch andere Zahlenangaben aehnlicher Struktur geben kann, darf immer nur das jeweils erste Auftreten ausgewertet werden.
hmm, dazu fehlt mir jetzt leider nichts ein :( Gute Nacht, Anibal --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
On 31-Oct-2000 Anibal Vasquez wrote:
Für touch ? Laut man touch muss das in der Form [[CC]YY]MMDDhhmm[.ss] liegen, also ohne ".", es sei denn zum Trennen der Sekundenangabe.
Das ist eben eines der Probleme, denn in den Dateien ist die Reihenfolge umgekehrt und auch noch mit Punkten versehen.
Und da es in den Dateien auch noch andere Zahlenangaben aehnlicher Struktur geben kann, darf immer nur das jeweils erste Auftreten ausgewertet werden.
hmm, dazu fehlt mir jetzt leider nichts ein :(
Ich mach das jetzt ganz altmodisch mit ein paar Scripten, die mit die noetigen Angaben liefern, um dann haendisch auf der Befehlszeile mit touch den Zeitstempel zu aendern.
Gute Nacht, Anibal
Danke, gleichfalls Gute Nacht,
Heinz.
--
E-Mail: Heinz W. Pahlke
Hallo, Heinz W. Pahlke wrote:
On 31-Oct-2000 Anibal Vasquez wrote:
Für touch ? Laut man touch muss das in der Form [[CC]YY]MMDDhhmm[.ss] liegen, also ohne ".", es sei denn zum Trennen der Sekundenangabe.
Das ist eben eines der Probleme, denn in den Dateien ist die Reihenfolge umgekehrt und auch noch mit Punkten versehen.
Vielleicht hilft ja folgendes (eine Zeile aber logisch umgebrochen): trings test.sdw | perl -e 'while (<>) { if (/^[0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]+/) { s/[^[0-9.]//eg; ($tag, $monat, $jahr) = split(/\./, $_ ); print "\n$tag\n$monat\n$jahr\n" } }' Da habe ich dann schonmal das Datum in einzelne Variablen gepackt. Ein umsortierten und formatieren duerfe dann leicht fallen und ein finales print $datum (oder so) wird dann an touch gepiped oder gleich aus perl heraus erledigt... HTH & CU David -- Linux is like a teepee: No windows, no gates, an Apache inside. --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
On Die, Okt 31, 2000 at 11:22:07 +0100, Anibal Vasquez wrote: [...]
Für touch ? Laut man touch muss das in der Form [[CC]YY]MMDDhhmm[.ss] liegen, also ohne ".", es sei denn zum Trennen der Sekundenangabe.
Man schaue in: man touch man date nach dem Parameter -d (*...which can be in various common formats...*), das sollte eine Menge Probleme lösen helfen. Jan --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (4)
-
Anibal.Vasquez@uni.de
-
David@dhaller.de
-
h.pahlke@berlin.de
-
Jan.Trippler@t-online.de