Вот команда, которую я ввожу.
find /home/things/backups -mtime +0 -exec echo "{}" >> /home/things/logs/backup.log \; -exec echo "Hourly rotate successful: $(date). {} was deleted." >> /home/things/logs/backup.log; \;
и вывод ниже.
find: missing argument to `-exec'
;: command not found
Файл backup.log создается нормально, но файл пустой.
решение1
С использованием:
find /home/things/backups -mtime +0 -exec \
sh -c 'echo "$0" >> /home/things/logs/backup.log; echo "Hourly rotate successful: $(date). $0 was deleted." >> /home/things/logs/backup.log;' {} \;
Запускаем новую оболочку sh
с командой -c
и параметром {}
( find
результатом). В команде мы используем этот параметр через $0
.
решение2
Давайте немного изменим расположение перенаправлений и добавим несколько переносов строк, чтобы увидеть, что вы на самом деле запускаете:
>> /home/things/logs/backup.log \
>> /home/things/logs/backup.log \
find /home/things/backups -mtime +0 -exec echo "{}" \; \
-exec echo "Hourly rotate successful: $(date). {} was deleted.";
\;
Вы перенаправляете
find
вывод , а не вывод команд, запущенных с помощью-exec
. Это повлияет на команды, запущенные с помощью ,-exec
поскольку они являются дочерними процессами и наследуют открытые файловые дескрипторы, поэтому эффект будет таким, как вам нужно, даже если способ, которым вы это сделали, был странным.Затем
;
в конце второгоexec
не был экранирован.find
Команда была завершена там без;
forexec
, что привело к ошибке.find
quit немедленно из-за этого, поэтому вывод не был произведен.Затем
\;
в конце обрабатывается оболочкой. Обычно это был бы разделитель операторов, но поскольку он экранирован, она пытается запустить его как команду. Это, естественно, не удается.
Попробуйте упростить команду:
find /home/things/backups -mtime +0 -exec \
bash -c 'printf "%s\nHourly rotate successful: $(date). %s was deleted.\n" "$0" "$0"' {} \; \
>> /home/things/logs/backup.log