Это - команда, которую я ввожу.
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, но файл пуст.
Используя:
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
.
Давайте изменим местоположение перенаправлений немного и добавим некоторые разрывы строки для наблюдения то, что Вы на самом деле выполняете:
>> /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
команда была завершена там без a ;
для exec
, порождение ошибки. find
выход сразу из-за этого, таким образом, никакой вывод не был произведен.
\;
в конце затем обрабатывается оболочкой. Обычно, это был бы разделитель оператора, но так как этого оставляют, это пытается выполнить его как команду. Это перестало работать, естественно.
Рассмотрите упрощение команды:
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