我有疑问,为什么我的“删除目录中除最后 20 个之外的所有文件”的 cmd 在 cron 中不起作用,但在命令提示符中却起作用。
* * * * * ls -1tr /home/testusr/test | head -n -20 | xargs -d '\n' rm -f > /var/opt/check.log 2>&1
目录包含每分钟生成的 100x 个名为 DATA-20140605xxxx 的文件。
提前感谢任何答复。
答案1
您遇到的问题是由于 ls 命令的输出不包含文件路径,而仅包含文件名。当 cron 作业运行时,它会在用户主目录中运行,因此当您的 rm 运行时,它会在 /home/testuser 中查找文件,而不是 /home/testuser/test。
你可以用简单的 cd 命令来解决这个问题
cd /home/testuser/test && ls -1tr /home/testusr/test ...
但这并不是很好,因为你正在解析 ls 的输出,这是一个馊主意TM请参阅链接以了解详细讨论。
答案2
如果您ls
从根目录运行该命令,您将获得文件列表,但不是路径。因此,实际上,您正在尝试从of中删除DATAblah
任何内容。cwd
cron
解决方案可以是:
- 将 chdir 嵌入到 cron 中(或将命令包装在脚本中)。
.
例如,使用除“ls echo /home/testuser/test/*”之外的其他命令将为您提供路径名。(但显然 - 没有定义的排序顺序)。- 找到一种方法将该路径作为 rm 的前缀。
不过,包装脚本通常是这类事情的好选择。你能改为基于时间删除吗?如果它们是按分钟加时间戳的,你能改为删除所有早于 10 分钟的文件吗?
在这种情况下:find /home/testuser/test/ -mmin +10 -exec rm {} \;
可能会奏效。