Verbesserte Technik einen Dateinamen in einer Variablen zu speichern?
Frage
Grüße,
Ich brauche den Dateinamen eines Protokolls in eine Variable zu speichern, so dass mein Skript einige Prüfungen auf die täglichen Log-Dateien ausführen können. Diese Protokolle haben immer einen anderen Namen, weil sie einen Zeitstempel im Namen haben. Derzeit verwende ich eine hodge podged Methode, dass Rohre ein Befehl ls zu sed, sortiert, geschnitten und Schwanz aus, um den Namen zu erhalten.
CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1 )
UPDATE:
$ CRON_DATE wird als Argument an das Skript geliefert. Es ist der Zeitpunkt (dem Tag), dass das Protokoll wurde am erstellt. Manchmal mehrere Protokolle für den gleichen Tag gibt es so möchte ich die jüngste zu bekommen.
Einige typische Dateinamen:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
etc ...
Beachten Sie bitte, dass das funktioniert, wie es ist. Ich denke nur, es ist hässlich und ich versuche, einen besseren Weg zu finden, um es auszuziehen.
Ich bin ziemlich sicher, dass ich dieses kluged zusammen aus einigen Sachen, die ich vor ein paar Monaten google gefunden. es funktioniert jetzt, aber ich bin nicht wirklich mit der Technik zufrieden. Ich habe einige Ideen, wie dies besser zu tun, aber ich habe auf dieser Seite hatte großen Erfolg vor und dachte, es am besten sein könnte zunächst auf die Götter Stackoverflow zu verweisen. Alle Antworten werden sehr geschätzt.
Danke, Ryan
Lösung
Wie wäre es
CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)
EDIT: Du hast Recht BTA, sollte ich das gefangen haben. Festgelegt.
Andere Tipps
Wenn Sie eine Protokolldatei analysieren, etwas tun, um Marke, dass es verarbeitet wurde, eine solche Umbenennung oder es in einen anderen Ordner verschieben. Auf diese Weise wird es keine Rolle, wenn die Datei erstellt wurde, nur dass es noch analysiert worden ist.
Ich würde auch vorschlagen, eine hohe Skriptsprache.
#!/bin/bash
shopt -s nullglob
last=
for file in "$LOGS_DIR"/fetch_cron_{false,true}_"$CRON_DATE"*.log
do
last="$file"
done
if [ -n "$last" ]
then
echo "$last"
else
echo "No match found" >&2
exit 1
fi
Für den Anfang versuchen:
FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`
Das Beseitigt cut
und handelt den sed
regulären Ausdruck für einen lesbaren (IMO) Aufruf tr
. Splitting in zwei Linien hilft bei der Klarheit als auch.
Wenn Sie keine andere Dateien in $LOGS_DIR
mit extrem ähnlichen Dateinamen (die in der Regel passieren, wenn Sie die Protokolle in Frage in einem eigenen Ordner halten), können Sie die Parameter auf ls
mit etwas einfacher wie $LOGS_DIR/fetch_*_$CRON_DATE*.log
ersetzen. Aus Gründen der Einfachheit nicht, dass die Linie macht komplizierter als erforderlich Sie nur die Dateien, um sicherzustellen, erhalten Sie benötigen.
Sie Ihr Datum zu sortierbar ändern können, indem das Jahr vor prefixing, dann tun
CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)