tecnica migliorata per memorizzare un nome di file in una variabile?
Domanda
Saluti,
ho bisogno di memorizzare il nome del file di un registro in una variabile in modo mio script in grado di eseguire alcuni controlli sui file di log quotidiane. Questi registri hanno sempre un nome diverso, perché hanno un timestamp nel nome. Attualmente sto usando un metodo di Hodge podged che i tubi di un comando ls a sed, ordinare, taglio, e la coda al fine di ottenere il nome fuori.
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 viene fornito come argomento per lo script. E 'la data (al giorno) che il registro è stato creato il. A volte esisteranno più registri per lo stesso giorno così voglio questo per ottenere il più recente.
Alcuni nomi di file tipiche:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
ecc ...
Si prega di tenere a mente che questo funziona come è. Penso solo che è brutto e sto cercando di trovare un modo migliore per tirarlo fuori.
Sono abbastanza sicuro che questo kluged insieme da un po 'di roba che ho trovato google qualche mese fa. ora funziona, ma io non sono davvero felice con la tecnica. Ho alcune idee su come fare questo meglio, ma ho avuto un grande successo su questo sito prima e ho pensato che potrebbe essere meglio per riferirsi agli dei StackOverflow prima. Tutte le risposte sono molto apprezzate.
Grazie, Ryan
Soluzione
Come su
CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)
EDIT: Hai ragione BTA, avrei preso quello. Fisso.
Altri suggerimenti
Dopo si analizza un file di registro, fare qualcosa per segnare che è stata elaborata, come un rinominandolo o lo spostamento in una cartella diversa. In questo modo non importa se il file è stato creato, ma solo che non è stato ancora analizzato.
Vorrei anche suggerire utilizzando un linguaggio più alto livello di script.
#!/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
Per cominciare, provare:
FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`
che elimina cut
e commercializza il sed
espressione regolare per una più leggibile (IMO) chiamata per tr
. La suddivisione in due linee aiuta con la chiarezza pure.
Se non si dispone di qualsiasi altro file in $LOGS_DIR
con nomi di file estremamente simili (che di solito accade se si tengono i registri in questione nella propria cartella), è possibile sostituire il parametro da ls
con qualcosa di più semplice come $LOGS_DIR/fetch_*_$CRON_DATE*.log
. Per motivi di semplicità, non fare quella linea più complicato di quanto necessario per essere sicuri di ottenere solo i file necessari.
è possibile modificare la data per ordinabili per anteponendo l'anno di fronte, poi fare
CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)