Für diejenigen, die nur eine Antwort wollen, hier ist es:
ls | sort -n -t _ -k 2 | tail -1
Hier der Gedanke, der mich hierher geführt hat.
Ich gehe davon aus, dass der [RANGE] Teil alles sein könnte.
Beginnen Sie mit dem, was wir wissen.
- Arbeitsverzeichnis:/incoming/extern/Daten
- Format der Dateien: [RANGE] _ [JJJJMMTT] .dat
Wir brauchen die aktuellste [JJJJMMTT] Datei finden in das Verzeichnis, und wir müssen diesen Dateinamen speichern.
Verfügbare Tools (Ich bin die Auflistung nur die entsprechenden Werkzeuge für dieses Problem ... Identifizierung sie wird mit der Praxis einfacher):
Ich denke, wir brauchen nicht sed, da wir mit der gesamten Ausgabe von ls Befehl arbeiten können.Mit ls, awk, sortieren und Heck können wir die richtige Datei wie so (bedenken Sie, dass Sie die Syntax gegen überprüfen, was Ihr Betriebssystem akzeptieren) erhalten:
NEWESTFILE=`ls | awk -F_ '{print $1 $2}' | sort -n -k 2,2 | tail -1`
Dann ist es nur eine Frage den Unterstrich wieder einzusetzen, was nicht zu schwer sein sollte.
EDIT: Ich hatte ein wenig Zeit, also habe ich den Befehl repariert, zumindest für den Einsatz in Solaris.
Hier ist der gewundene erste Durchlauf (dies setzt voraus, dass ALLE Dateien im Verzeichnis im selben Format sind: [RANGE] _ [yyyymmdd] .dat). Ich wette, es gibt bessere Möglichkeiten, dies zu tun, aber das funktioniert mit meinen eigenen Testdaten (in der Tat fand ich einen besseren Weg, gerade jetzt, siehe unten):
ls | awk -F_ '{print $1 " " $2}' | sort -n -k 2 | tail -1 | sed 's/ /_/'
... während dieses Schreiben aus Ich entdeckte, dass Sie das einfach tun können:
ls | sort -n -t _ -k 2 | tail -1
Ich werde es in Teile zerlegen.
ls
Einfach genug ... ruft die Verzeichnisliste ab, nur Dateinamen. Jetzt kann ich das in den nächsten Befehl pumpen.
awk -F_ '{print $1 " " $2}'
Dies ist der AWK-Befehl. Sie können eine Eingabezeile verwenden und sie auf eine bestimmte Weise ändern. Hier sage ich nur, dass awk die Eingabe unterbrechen sollte, wo immer ein Unterstrich (_) ist. Ich mache das mit der Option -F. Das gibt mir zwei Hälften jedes Dateinamens. Ich sage dann awk, um die erste Hälfte ($ 1) auszugeben, gefolgt von einem Leerzeichen ("") , gefolgt von der zweiten Hälfte ($ 2). Beachten Sie, dass der Raum der Teil war, der von meinem ursprünglichen Vorschlag fehlte. Dies ist auch nicht notwendig, da Sie im folgenden Sortierbefehl ein Trennzeichen angeben können.
Jetzt wird der Ausgang in jeder Zeile in [RANGE] [JJJJMMTT] .dat aufgeteilt. Jetzt können wir das sortieren:
sort -n -k 2
Dies nimmt die Eingabe und sortiert es basierend auf dem 2. Feld. Der Befehl sort verwendet standardmäßig Leerzeichen als Trennzeichen. Beim Schreiben dieses Updates habe ich die Dokumentation für sort gefunden, mit der Sie das Trennzeichen angeben können, sodass AWK und SED nicht erforderlich sind. Nehmen Sie die LS und führen Sie sie durch die folgende Sortierung:
Dies erreicht das gleiche Ergebnis. Jetzt wollen Sie nur die letzte Datei, so:
tail -1
Wenn Sie awk verwendet, um die Datei zu trennen (die nur zusätzliche Komplexität hinzufügt, so tun es nicht sheepish), können Sie den Raum ersetzen ein Unterstrich wieder mit sed:
sed 's/ /_/'
Einige gute Infos hier, aber ich bin sicher, dass die meisten Leute gehen lesen bis auf den Boden nicht so.
Kann [RANGE] eine Kombination aus zwei Zeichen sein? Das macht einen großen Unterschied, wie Sie wahrscheinlich anhand der bereits gegebenen Antworten feststellen werden. –
Ja, sie können anders sein. Und derselbe Ordner enthält auch andere Dateitypen mit Namen, die nicht den oben gezeigten entsprechen. – ziggy