2010-03-18 3 views
0

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

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

UPDATE:

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

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

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

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

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

+0

Здесь необходимо указать больше информации. Что такое типичные имена файлов? Какой файл журнала вы хотите получить? Что такое '$ CRON_DATE'? –

+1

Обновлено. Спасибо за примечание. – SDGuero

+1

Скажите, что улучшит это прямо сейчас - сделайте шаг в несколько операций. Выполнение однострочного слоя - это хороший способ взглянуть на код позже и сделать себе лицо. Читаемость всегда лучше, чем умение, 0) – 2010-03-18 23:01:41

ответ

2

Как насчет

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

EDIT: Вы правы ВТА, я поймал это. Исправлена.

+1

Это будет самый последний журнал, но я думаю, что OP хочет получить самый последний журнал с указанной даты (передается через '$ CHRON_DATE'). – bta

+0

Многое чистое, чем то, что я сейчас делаю. Благодаря! : D – SDGuero

1

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

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

0

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

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

Это не сработало бы потому, что все «ложные» даты были бы алфавитами перед любой из «истинных» дат, независимо от того, был ли префикс года или нет. Вам понадобится еще один шаг, чтобы удалить дату из текста. – bta

+0

обратите внимание, что ОП упомянул, что его команда работает как есть. – ghostdog74

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 
+0

Хм. Это интересно ... Мне нравится ловушка и буду думать об этом дальше. Благодарю. – SDGuero

1

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

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

+0

Спасибо, Бта. Сначала я взял ваш, но затем увидел, что Бета внизу (что вы помогли исправить), которая также работала. Я собираюсь использовать это решение, но спасибо за помощь. – SDGuero

 Смежные вопросы

  • Нет связанных вопросов^_^