Создайте файл журнала для Rsync, если он не существует

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

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

rsync -azP --stats source-directory [email protected]:destination-directory --log-file=~/public_html/rsynclogs/rsync-backup-log-`date +"%Y-%m-%d"`.log

Эта команда дает мне ошибку

rsync: failed to open log-file ~/public_html/rsynclogs/rsync-backup-log-2017-01-11.log: No such file or directory (2)
Ignoring "log file" setting.

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


person Fahad Sohail    schedule 11.01.2017    source источник


Ответы (3)


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

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

mkdir -p -v $HOME/public_html/rsynclogs/
rsync -azP --stats source-directory [email protected]:destination-directory --log-file=$HOME/public_html/rsynclogs/rsync-backup-log-$(date +"%Y-%m-%d").log

Теперь mkdir создает каталог. Как предложил @janek, я добавил -p только для того, чтобы он проверял, существует ли каталог, и создавал его только в том случае, если он не существует.

Другие обновления синтаксиса:

Заменил ~ на $HOME. Предложено @l'L'l

Заменил backticks(``) на $( ... ). Предложено @l'L'l

person Fahad Sohail    schedule 12.01.2017
comment
Благодаря этому сообщению я смог определить 3 действительные формы, которые работают!: --log-file=$HOME/path ИЛИ --log-file="$HOME/path" ИЛИ --log-file ~/path - person Steve Benner; 15.05.2019

Проблема в тильде (~) на вашем пути. Вам нужно либо удалить =, либо использовать:

--log-file="$HOME/public_html/rsynclogs/rsync-backup-log-$(date +"%Y-%m-%d".log)"

Также обратные кавычки являются устаревшими и должны быть заменены на $( ... )

person l'L'l    schedule 11.01.2017
comment
замена $HOME на все ~ по-прежнему дает мне ту же ошибку. Также я не понял, что вы подразумеваете под обратными кавычками? Извините, я новичок в этом.. - person Fahad Sohail; 11.01.2017
comment
Существует ли каталог, в который вы пытаетесь записать файл (например, $HOME/public_html/rsynclogs/, он же ~/public_html/rsynclogs/, он же /Users/YourUser/public_html/rsynclogs/)? Сначала создайте каталог, если он не существует. Также удалите = из --log-file=, так что это будет --logfile "~/path"... это необходимо, если вы используете ~. Backticks - это галочки ( ` ), которые у вас есть вокруг вашей даты cmd.. - person l'L'l; 11.01.2017
comment
Нет. Но я хочу создать его, если он не существует. Является ли это возможным? - person Fahad Sohail; 11.01.2017
comment
Да, просто создайте его сейчас, выполнив mkdir ~/public_html/rsynclogs, тогда он должен принять ваш файл журнала при rsync. Иногда вам также может понадобиться изменить права доступа к нему, но его создание — это первый шаг. - person l'L'l; 11.01.2017
comment
Огромное спасибо, что указали на это! Bash иногда может быть таким сложным... Даже спустя годы иногда мне не хватает таких вещей; синтаксис очень разборчив, и ваше предложение помогло мне осознать свою ошибку. - person Steve Benner; 15.05.2019

Простым способом было бы выполнить touch для создания пустого файла перед выполнением rsync:

touch `date +"%Y-%m-%d"`.log
rsync <options>

touch создает пустой файл, если имя файла не существует, но если файл существует, он просто обновляет время последнего изменения.

person Janek    schedule 11.01.2017
comment
При использовании touch он также выдает ошибку при касании touch: cannot touch ~/public_html/rsynclogs/rsync-backup-log-2017-01-11.log': No such file or directory Скорее всего, он также ищет несуществующий каталог с именем rsynclogs - person Fahad Sohail; 11.01.2017
comment
В этом случае либо создайте каталог rsynclogs заранее, либо каждый раз в скрипте, используя mkdir -p ‹путь› - person Janek; 11.01.2017
comment
можем ли мы проверить, существует ли каталог, не создавайте его, если он существует, то создайте его? - person Fahad Sohail; 11.01.2017
comment
@FahadSohail Вот что делает флаг -p для mkdir — при необходимости создает каталог, не возвращает ошибку, если он существует. - person Janek; 11.01.2017