Улучшенный метод сохранения имени файла в переменной?

StackOverflow https://stackoverflow.com/questions/2473842

Вопрос

Приветствую вас,

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

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 )

Обновить:

$CRON_DATE предоставляется в качестве аргумента скрипту.Это дата (с точностью до дня), в которую был создан журнал.Иногда за один и тот же день будет существовать несколько журналов, поэтому я хочу, чтобы это был самый последний.

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

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

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

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

Это было полезно?

Решение

Как насчет

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

Редактировать: Ты прав, бта, я должен был это заметить.Исправлено.

Другие советы

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

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

#!/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

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

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.Для простоты не усложняйте эту строку больше, чем требуется, чтобы убедиться, что вы получаете только те файлы, которые вам нужны.

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

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top