Erhalten Sie die neueste Datei basierend auf Zeitstempel
Ich bin neu in shell-scripting, so brauche ich etwas Hilfe brauchen, wie Sie gehen über mit diesem problem.
Habe ich ein Verzeichnis, das Dateien enthält, die in dem folgenden format. Die Dateien werden in einem Verzeichnis namens /incoming/extern/Daten
AA_20100806.dat
AA_20100807.dat
AA_20100808.dat
AA_20100809.dat
AA_20100810.dat
AA_20100811.dat
AA_20100812.dat
Wie Sie sehen können, die mit dem Namen der Datei enthält einen Zeitstempel. d.h. ein [BEREICH]_[YYYYMMDD].dat
Was ich tun müssen, ist herauszufinden, welche dieser Dateien verfügt über die neueste Datum mit dem Zeitstempel an den Dateinamen, nicht die system-timestamp und speichert die Dateinamen in einer Variablen, und verschieben Sie es in ein anderes Verzeichnis und verschieben den rest auf ein anderes Verzeichnis.
Ja, Sie können unterschiedlich sein. Und auch die gleichen Ordner enthalten andere Arten von Dateien mit Namen, die nicht wie jene, die oben gezeigt.
InformationsquelleAutor ziggy | 2010-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diejenigen, die wollen einfach nur eine Antwort, hier ist es:
Hier ist der Denkprozess, der führte mich hierher.
Ich werde davon ausgehen, dass der [BEREICH] - Teil könnte alles sein.
Beginnen Sie mit dem, was wir wissen.
Wir müssen feststellen, dass die letzten [YYYYMMDD] - Datei in das Verzeichnis, und wir brauchen, um zu speichern, mit dem Namen.
Verfügbaren Werkzeuge (ich bin nur auf die Auflistung der relevanten tools für dieses problem ... diese zu identifizieren wird leichter mit der Praxis):
Ich denke, wir brauchen keine sed, da können wir die Arbeit mit dem gesamten output des ls-Befehls. Mit ls, awk, sort, tail, den wir bekommen können die richtige Datei so (bedenkt, dass müssen Sie überprüfen Sie die syntax, gegen das, was Ihr OS akzeptiert):
Dann ist es nur eine Frage der Einführung der Unterstrich wieder an, die sollte nicht zu hart sein.
EDIT: hatte ich ein wenig Zeit, also habe ich um die Festsetzung der Befehl, zumindest für den Einsatz in Solaris.
Hier ist die gewundene ersten Passes (dies setzt Voraus, dass ALLE Dateien in dem Verzeichnis sind im gleichen format ein: [BEREICH]_[yyyymmdd].dat). Ich Wette, es gibt bessere Möglichkeiten, dies zu tun, aber das funktioniert mit meiner eigenen test-Daten (in der Tat, ich fand eine bessere Art und Weise gerade jetzt; siehe unten):
... beim schreiben dieses heraus darzustellen, entdeckte ich, dass Sie genau dies tun:
Werde ich brechen Sie in Teile.
Einfach genug ... wird das Verzeichnis, nur Dateinamen. Jetzt kann ich das Rohr, das in den nächsten Befehl.
Dies ist der AWK-Befehl. es ermöglicht Ihnen, auf eine input-Zeile und ändern Sie es in einer bestimmten Weise. Hier, alles was ich Tue, ist die Angabe, dass awk sollten brechen Sie die Eingabe überall dort, wo eine underscord (_). Ich mache das mit der -F-option. Dies gibt mir die zwei Hälften jeweils mit dem Namen. Ich Sag dann awk die Ausgabe der ersten Hälfte ($1), gefolgt von einem Leerzeichen (" ")
gefolgt von der zweiten Hälfte ($2). Beachten Sie, dass der Raum, war der Teil, der fehlt aus meiner ersten Vorschlag. Auch dies ist unnötig, da Sie angeben können, ein Trennzeichen in der sort-Befehl unten.
Nun die Ausgabe ist aufgeteilt in [BEREICH] [yyyymmdd].dat in jeder Zeile. Jetzt können wir Sortieren:
Dieser nimmt den input und sortiert, basierend auf dem 2. Feld. Der sort-Befehl wird mit Leerzeichen als Trennzeichen standardmäßig. Während des Schreibens dieses update, fand ich die Dokumentation für die Art, die Ihnen ermöglicht, geben Sie das Trennzeichen an, so AWK und SED sind unnötig. Nehmen Sie die ls und die pipe durch die folgende Art:
Dies erzielt das gleiche Ergebnis. Jetzt wollen Sie nur die Letzte Datei, so:
Wenn Sie verwendet awk, um die Datei trennen (das ist nur zusätzliche Komplexität, also tun Sie es nicht schüchtern), ersetzen Sie die Leerzeichen mit einem Unterstrich wieder mit sed:
Einige gute Infos hier, aber ich bin sicher, die meisten Menschen sind nicht zu Lesen, bis auf den Boden wie dieser.
Nun, ich aktualisiert, nach der Prüfung. Ich hatte, etwas zu reparieren, in meinem awk-Befehl, und dann entdeckt, wie es wirklich nicht sein müssen. Lösung ist an der Spitze, eine Erklärung ist lang und nicht notwendig, aber ich genoss es zu schreiben.
Für mich funktioniert. Bitte, mein baby habe.
Eine der besten Antworten, die ich begegnet bin, auf SO. Danke.
InformationsquelleAutor Marc Reside
Sollte dies funktionieren:
Funktioniert es nicht, wenn es Leerzeichen im Dateinamen Sie können zwar ändern, die
IFS
variable zu beeinflussen.Meinst du den äußeren auf die zweite Zeile? Sie erstellen ein array das verwendet wird, in der letzten Zeile.
Hallo Dennis, ich war eine Anspielung auf sowohl den inneren und äußeren Runden Klammern. Ich habe versucht mit dem oben, aber die Klammern sind, was syntax-Fehler. Ich bin mit der bourne-shell. Sind diese korn-shell-spezifische Konstrukte?
Die inneren Klammern (wirklich
$()
) sind für die Kommando-substitution. Sie funktionieren besser als die, aber die gleiche Funktion erfüllen wie, backticks. Die syntax, die ich gezeigt habe, ist für die Bash, die Sie mit dem Stichwort Ihrer Frage. Es sollte auch mit der ksh-Shell. Die$()
sollte insh
aber die array-syntax nicht, da die Bourne-shell nicht haben-arrays.Ich mag diese Lösung. Wenn ziggy tun will, um diese in ein Skript, dann kann er immer angeben #!/usr/sh an den Anfang des Scriptes, kann er nicht? Es gibt nicht viel in der Bourne-shell, die nicht getan werden kann in sh.
InformationsquelleAutor Dennis Williamson
Versuchen:
Hoffe, es hilft.
Nein, es sortiert die Dateien nach name entsprechend Ihrem Gebietsschema. Wenn Sie wollte, zu Sortieren, indem die system-timestamp, müssen Sie die
-t
Flagge.InformationsquelleAutor Pablo Santa Cruz
Verwenden:
(vorausgesetzt, es gibt keine andere passende Dateien
AA_*.dat
)InformationsquelleAutor igor
InformationsquelleAutor ghostdog74
Aufgrund der Namenskonvention der Dateien, die alphabetische Reihenfolge ist die gleiche, wie Datum der Bestellung. Ich bin mir ziemlich sicher, dass in bash '*' erweitert sich alphabetisch (aber nicht finden können, keine Beweise in der manual-Seite), ls sicherlich nicht so, dass die Datei mit dem neuesten Datum, das wäre die Letzte alphabetisch.
Daher in bash
Sollte den trick tun.
Wenn Sie möchten, um genauer zu sein über die Wahl der Datei, und ersetzen Sie dann
*
mit etwas anderem - zum BeispielAA_*.dat
Warum wollen Sie nicht zu verlassen, auf
ls
- was meinst du mit 'system'?InformationsquelleAutor Beano
Meine Lösung zu diesem ist ähnlich wie andere, aber ein wenig einfacher.
Was ist tatsächlich Verlass ist auf ls die Ausgabe zu Sortieren, und verwendet den Schwanz, um die Letzte aufgelistete Datei name.
Diese Lösung wird nicht funktionieren, wenn der Dateiname, den Sie benötigen, einen führenden Punkt (zB .Profil).
Diese Lösung funktioniert, wenn der Dateiname ein Leerzeichen enthält.
InformationsquelleAutor Chris Woollard