我有一个 cron 作业调用一个 bash 脚本,该脚本运行良好,但其中有一行应该删除目录中的所有文件。此行的结果始终是“没有这样的文件或目录”,尽管我已经(多次)验证该目录中有文件。有问题的行很简单:
rm /dir1/dir2/dir3/*
在终端中手动运行时,脚本运行良好,因此这一定与 cron 的运行方式有关。我尝试为“dir3”及其内部的所有文件提供所有可能的权限,因此这不应该是权限问题。(目录和文件也归用户所有)。我尝试在“crontab”中指定“SHELL=/bin/bash”。没有设置粘性位,rm 命令上也没有别名。
有趣的是,将“rm”命令更改为“ls”会产生相同的负面结果(除非您删除尾随的“*”,然后就可以了)。
我在这里遗漏了什么?
答案1
最终还是我的错。我脚本里实际写的是:
rm "/dir1/dir2/dir3/*"
我没有意识到引号会阻止通配符扩展,所以我从未将它们包含在问题中。删除引号解决了这个问题,因为我确信如果我包含它们,就会有人向我指出。虽然我不能 100% 确定在没有引号的情况下应该如何处理路径中的空格。
答案2
尝试将以下内容放入脚本中并从您的 cron 作业中调用它。
#!/bin/bash
rm -rf /full/path/to/dir/*
由于您使用的 rm 没有使用 -f(强制)选项,因此 cron 作业可能失败。rm 每次都会询问您是否确定要删除文件。
添加的 -r(递归)选项将确保 /full/path/to/dir/ 下的所有目录也被删除。
rm 手册页可以在这里。
答案3
您没有说您使用的是什么操作系统,但 SELinux 会产生干扰吗?
答案4
你在使用 时得到了什么rm -v /full/path/to/directory/*
,而这个 glob 扩展为什么?也许参数太多了 - 如果是这样,请使用类似find /full/path/to/directory -delete; mkdir -p /full/path/to/directory