find -delete 可以正常工作,但不能与 cron 一起使用

find -delete 可以正常工作,但不能与 cron 一起使用

请注意我已经阅读了所有类似的问题,包括 cron、路径、环境变量等等,但没有发现任何可以解决我的特定问题的方法。


我有一个脚本,可以生成一些 MySQL 转储,然后删除旧的转储,如下所示:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

上述命令已根据评论中的建议对我的原始命令进行了修改

但是,当 cron 运行此脚本时,文件不会被删除。cron 用户是 root。

调试说明

  • 如果我手动运行出现该命令的脚本,它会按预期删除它们。

  • 如果我以 root 身份从命令行单独运行上述 find 命令,它会按预期删除它们(并且使用 -print 它会按预期返回超过 5 天的文件列表)

  • 我还在 root 的 crontab 中添加了明确的路径语句,但这
    并没有改变任何东西。

  • Cron 没有发送任何错误,如果我将查找操作传送到日志文件,则
    文件将变为空或根本没有创建。

  • 我正在使用 Ubuntu 服务器 14.04.03 LTS。

答案1

问题是运行时crontab没有$PATH设置。你实际上可以通过将其添加到通过打开的文件顶部来为其提供路径crontab -e

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

(或任何PATH你喜欢使用的名称)。这意味着你可以避免直接从 cron 指定命令的完整路径。

您的原始命令存在多个问题。您基本上是在要求 shell 进行通配符扩展,而不是find。其次,您没有提供 的完整路径rm;使用/bin/rm/usr/bin/rm,无论它位于系统上的哪个位置(请参阅which rm)。

find 的第一个参数是“要搜索的位置”,然后使用各种-<option>s 指定“搜索查询”。因此,您要运行的命令的正确格式是:

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;

或者

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

如果您没有PATH像上面那样指定定义,请使用:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;

或者

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

答案2

尝试一下

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete

答案3

如果我直接从 root 的 crontab 调用 find 命令而不是作为脚本的一部分,那么它就可以工作。

有问题的脚本使用 csh。我相信 Ubuntu 上的 root 的 cron 环境将使用 /bin/bash(或 /bin/dash?)。也许这与 find 命令的运行方式有某种冲突。

无论如何,它解决了主要问题,尽管有点不太优雅。

答案4

亲爱的 Crontab 默认使用 sh shell 而不是 bash。您可以使用 /dev/null 来清空文件。检查下面的脚本。它会有所帮助。

#!/bin/bash
tar=$(ls -lt /backup/manual | grep ^d | tail -n1 | awk '{print $NF}')
for i in $(find /backup/manual/"$tar" -type f ) 
 do cat /dev/null > "$i" 
done > /dev/null 2>&1 && mv /backup/manual/"$tar" /tmp/

解释:请使用 for 循环访问目标文件夹中的所有文件,并使其变为空,最后移动到 /tmp 目录

相关内容