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

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top