Возможно добавить текущую дату в рабочий путь rsyn c? - PullRequest
1 голос
/ 26 апреля 2020

У меня есть ежечасная задача cron rsyn c, которая используется для добавления новых файлов на сервер резервного копирования. Структура каталогов следующая: /myfiles/year/month/date где год, месяц и дата являются фактическими датами файлов. Задача Cron определяется как файл в /etc/cron.d

Проблема в том, что мне нужно указать каталог "root" /myfiles, чтобы rsyn c реплицировал структуру моей папки в хранилище резервных копий. с каждым новым днем. Количество файлов является значительным - до 1000 файлов в день, поэтому rsyn c необходимо перебирать все годовые файлы для создания списка копий, хотя это вообще не нужно, потому что мне нужно копировать только сегодняшние файлы. По состоянию на апрель это занимает ~ 25 минут даже с опцией --ignore-existing.

Может кто-нибудь помочь мне создать скрипт или что-то еще, чтобы добавить текущий год, месяц и дату к рабочему пути rsyn c в Задача cron, если возможно? Окончательный результат должен выглядеть следующим образом:

0 * * * *  root rsync -rt --ignore-existing /myfiles/2020/04/26 user@myserver:/myfiles/2020/04/26

, где /2020/04/26 - переменная часть, которая меняется каждый день.

У меня очень ограниченный опыт работы с * nix системами, поэтому я чувствую, что это возможно, но в основном понятия не имею, как начать.

1 Ответ

1 голос
/ 26 апреля 2020

Чтобы добавить фактическую дату в путь, можно использовать утилиту date или встроенный printf из оболочки bash.

Использование date

echo "/myfiles/$(date +%Y/%m/%d)"

Использование printf

echo "/myfiles/$(printf '%(%Y/%m/%d)T')"

В вашем случае при использовании встроенного printf вам необходимо определить оболочку как bash в записи cron.

0 * * * *  root rsync -rt --ignore-existing "/myfiles/$(printf '\%(\%Y/\%m/\%d)T')" "user@myserver:/myfiles/$(printf '\%(\%Y/\%m/\%d)T')"

Использование date либо определите PATH, чтобы включить, где находится утилита date, либо просто используйте абсолютный путь

0 * * * *  root rsync -rt --ignore-existing "/myfiles/$(/bin/date +\%Y/\%m/\%d)" "user@myserver:/myfiles/$(/bin/date +\%Y/\%m/\%d)"
  • Синтаксис date должен работать как на GNU, так и на BSD дата.

  • * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * % * * * * * * * * * * * *1031* * * * * *1031* * * * * *1031* 1035

    См. местную документацию по cron(5) о том, как добавьте переменные PATH и SHELL. Хотя ОБОЛОЧКА обычно может быть SHELL=/bin/bash и ПУТЬ к PATH=/sbin:/bin:/usr/sbin:/usr/bin

...