Отсутствует аргумент для -exec

Отсутствует аргумент для -exec

Вот команда, которую я ввожу.

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Команда была завершена там без ;for exec, что привело к ошибке. findquit немедленно из-за этого, поэтому вывод не был произведен.

  • Затем \;в конце обрабатывается оболочкой. Обычно это был бы разделитель операторов, но поскольку он экранирован, она пытается запустить его как команду. Это, естественно, не удается.

Попробуйте упростить команду:

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

Связанный контент