这是我正在输入的命令。
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
情况下终止,从而导致错误。因此立即退出,因此没有产生任何输出。;
exec
find
\;
然后 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