2015-09-11 5 views
0

Я использовал logrotate для создания файла журнала, который перекатывается каждый день в 03:00; поэтому создается файл имеет следующий формат:Как автоматизировать вызов файла, который создается ежедневно с отметкой даты в имени файла

userlog.%Y-%m-%d 

сценарий затем молниеносно файл, а поэтому конечный результат userlog.%Y-%m-%d.gz .... фактическое имя файла userlog.2015-09-09.gz.

Я пишу сценарий оболочки, который будет копировать созданный файл каждый день, а затем разархивировать его, запустить поиск в журнале, извлечь результаты, отформатировать их, а затем отправить по электронной почте, а затем удалить скопированный ZIP-файл.

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

Я пытаюсь выполнить следующую команду:.

sudo cp userlog.%Y-%d-%m.gz /home/local/temp 

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

Если бы вы могли исправить мой подход и понимание этой концепции. Или, пожалуйста, дайте мне знать, если вы считаете, что это должно сработать. Или если есть альтернативный подход к вызову файла, созданного таким образом, то любезно посоветуйте.

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

ответ

1

Вам нужен простой command substitution.

sudo cp userlog.$(date +%Y-%d-%m).gz /home/local/temp 

%Y сам по себе является только статической строкой; но при передаче в качестве аргумента команды date он указывает четырехзначный год для данной даты. (По умолчанию - сегодняшняя дата.)

Независимо от ваших проблем с этой конкретной командой, вам, безусловно, не нужно редактировать файл сценария каждый день. Очень фундаментальной особенностью скриптов является параметризация аргументов. Если текущий сценарий выглядит

#!/bin/bash 
gzgrep -c "failure" /path/to/userlog.2015-09-11.gz 
sudo cp /path/to/userlog.2015-09-11.gz /home/local/temp 

то он легко может быть переработан, чтобы прочитать дату в качестве параметра командной строки:

#!/bin/bash 
: ${1?"Syntax: $0 yyyy-mm-dd"} 
gzgrep -c "failure" /path/to/userlog."$1".gz 
sudo cp /path/to/userlog."$1".gz /home/local/temp 

Если вы сохранили это как userlog где-то в вашем PATH, решение к исходной задаче теперь было бы просто

userlog $(date +%Y-%m-%d) 

, которые, конечно, могут быть сохранены в виде сценария, также, или как функция оболочки в вашем ре rsonal .bash_profile или аналогичный. Но если это обязательная ежедневная процедура, вы, вероятно, предпочтете добавить ее в качестве задания cron, чтобы запускать каждое утро (даже если вы далеко). Cron отправит вам электронное письмо с любым выходом. (Обратите внимание, что cron не обязательно имеет то же самое PATH и т. Д. Как ваша интерактивная оболочка для входа.)

+0

К сожалению, это не сработало. Я должен был упомянуть, что я запускаю этот скрипт в Solaris ... не уверен, может ли это повлиять на формат этой команды? – nomi

+0

Нет, даже [Solaris 'date'] (http: // docs.oracle.com/cd/E19253-01/816-5165/6mbb0m9dc/index.html) является на удивление стандартным в этом отношении. Как это не удается? Выводит ли только 'date +% Y-% m-% d' в запросе нужный результат? – tripleee