删除目录中除最后 20 个文件之外的所有文件

删除目录中除最后 20 个文件之外的所有文件

我有疑问,为什么我的“删除目录中除最后 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任何内容。cwdcron

解决方案可以是:

  • 将 chdir 嵌入到 cron 中(或将命令包装在脚本中)。
  • .例如,使用除“ls echo /home/testuser/test/*”之外的其他命令将为您提供路径名。(但显然 - 没有定义的排序顺序)。
  • 找到一种方法将该路径作为 rm 的前缀。

不过,包装脚本通常是这类事情的好选择。你能改为基于时间删除吗?如果它们是按分钟加时间戳的,你能改为删除所有早于 10 分钟的文件吗?

在这种情况下:find /home/testuser/test/ -mmin +10 -exec rm {} \;可能会奏效。

相关内容