Улучшенная техника для хранения имени файла в переменной? - PullRequest
0 голосов
/ 19 марта 2010

Привет,

Мне нужно сохранить имя файла журнала в переменной, чтобы мой скрипт мог выполнять некоторые проверки файлов ежедневного журнала. У этих журналов всегда есть другое имя, потому что у них есть метка времени в имени. В настоящее время я использую метод hodge podged, который передает команду ls в sed, sort, cut и tail для получения имени.

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 предоставляется в качестве аргумента скрипту. Это дата (до дня), когда был создан журнал. Иногда в один и тот же день могут существовать несколько журналов, поэтому я хочу, чтобы это было самым последним.

Некоторые типичные имена файлов:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
и т.д ...

Пожалуйста, имейте в виду, что это работает как есть. Я просто думаю, что это некрасиво, и пытаюсь найти лучший способ справиться с этим.

Я почти уверен, что соединил это с некоторыми материалами, которые я нашел в Google несколько месяцев назад. это работает сейчас, но я не очень доволен техникой. У меня есть некоторые идеи о том, как сделать это лучше, но я уже имел большой успех на этом сайте и подумал, что лучше сначала обратиться к богам стека переполнения. Все ответы приветствуются.

Спасибо, Райан

Ответы [ 5 ]

2 голосов
/ 19 марта 2010

Как насчет

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)

РЕДАКТИРОВАТЬ: Вы правы bta, я должен был поймать это. Исправлено.

1 голос
/ 19 марта 2010

Для начала попробуйте:

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`

Это избавляет от cut и обменивает регулярное выражение sed на более читаемый (IMO) вызов tr. Разделение на две строки также помогает с ясностью.

Если у вас нет других файлов в $LOGS_DIR с очень похожими именами файлов (что обычно происходит, если вы храните эти журналы в отдельной папке), вы можете заменить параметр на ls на что-то более простое $LOGS_DIR/fetch_*_$CRON_DATE*.log. Для простоты не делайте эту строку более сложной, чем требуется, чтобы обеспечить получение только тех файлов, которые вам нужны.

1 голос
/ 19 марта 2010
#!/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
1 голос
/ 19 марта 2010

После анализа файла журнала сделайте что-нибудь, чтобы отметить, что он был обработан, например переименовать его или переместить в другую папку. Таким образом, не будет иметь значения, когда файл был создан, только то, что он еще не был проанализирован.

Я бы также предложил использовать язык сценариев более высокого уровня.

0 голосов
/ 19 марта 2010

вы можете изменить дату сортировки на префикс года, а затем сделать

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
...