缺少 -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和参数{}(结果)启动一个新 shell 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未被转义。该命令在没有for 的find情况下终止,从而导致错误。因此立即退出,因此没有产生任何输出。;execfind

  • \;然后 shell 会处理末尾的 。通常,它是一个语句分隔符,但由于它被转义了,因此它会尝试将其作为命令运行。这自然会失败。

考虑简化命令:

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

相关内容