Арифметика даты сценария оболочки - PullRequest
0 голосов
/ 23 марта 2011

Вот моя проблема высокого уровня.

Я хочу прочитать число max_age_in_secs из файла конфигурации. Это число представляет количество секунд, которое мы считаем файлом "старым". После того, как мы прочитаем этот конфиг, мы хотим найти все файлы в каталоге data и удалить все файлы, измененные ранее max_age_in_secs секунд назад.

Это должно быть сделано в виде сценария оболочки, а точнее оболочки korn.

Сейчас я делаю прикосновение к фиктивному файлу, который нужно изменить max_age_in_secs назад, а затем find и его опции ! -newer для поиска файлов старше этого *.

У меня проблема с получением метки времени для передачи на touch. Команда date на моем unix-боксе не имеет опции --date, поэтому я не могу ее использовать.

Я смотрю на perl -e "blah_blah_blah", но мне нужно передать переменную max_age_in_secs команде perl. Единственный известный мне способ сделать это - создать новый файл .pl и передать в него аргументы. Но в идеале я хотел бы иметь эту функциональность в одном файле сценария korn. Обходной путь может заключаться в создании переменной perl_command и выполнении ее содержимого, но я думаю, что это небезопасно и уязвимо для инъекций.

Но я относительно новичок в сценариях оболочки и Perl, поэтому любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Существует несколько способов передачи переменной среды из оболочки в однострочную команду perl:

  • Непосредственно. Большинство оболочек (включая korn) интерполируют выражения внутри двойных кавычек.
perl -e "print $VAR"

так что в этом случае $VAR исходит от оболочки. У этой техники есть много недостатков, а именно, что с `-e" выражением в двойных кавычках "очень сложно использовать другие переменные Perl или использовать множество других полезных конструкций Perl, которые могут быть неправильно истолкованы оболочкой.

  • В качестве аргумента командной строки, доступ к которому осуществляется в скрипте perl в @ARGV
perl -e 'print "VAR is $ARGV[0]"' $VAR

Это будет делать, если вам не нужно использовать @ARGV (которые неявно используются, если вы используете переключатели -p или -n или если ваша программа использует оператор <> по умолчанию).

  • Через хэш Perl %ENV.
perl -e 'print "VAR is $ENV{VAR}"'

Этот механизм не мешает @ARGV

1 голос
/ 23 марта 2011
perl -e '... $ENV{max_age_in_secs}...'

пока вы делаете

export max_age_in_secs

в баш / ш / кш

0 голосов
/ 23 марта 2011

Вместо секунд используйте минуты.Последние версии find имеют опцию mmin.Например, следующие команды удаляют файлы старше минуты.

find /path/ -type f -mmin +1 -exec rm {} \;
...