优化一个删除文件的shell脚本/命令

优化一个删除文件的shell脚本/命令

我正在运行 Magento,它不会清理旧的会话数据,因此我需要使用 shell 脚本/cronjob 来清理它:

0,30 * * * * /usr/bin/find /var/www/magento/var/session -name 'sess_*' -type f -mtime +1 -exec rm {} \;

但该脚本通常需要几分钟才能删除旧文件。我想知道是否需要搜索文件,因为此目录中只有以“sess_”开头的文件 - 但我仍然需要以某种方式遍历这些文件,对吗?

(每天大约在此目录中创建 50.000 个文件)

答案1

rm根本不用费心执行, find 可以处理它:

0,30 * * * * /usr/bin/find /var/www/magento/var/session -name 'sess_*' -type f -mtime +1 -delete

答案2

如果该目录中唯一的内容是sess_*文件,则可以省略-name 'sess_*', 并find无论如何都会遍历。通过移除该部件来测试它会匹配什么-exec

$ /usr/bin/find /var/www/magento/var/session -type f -mtime +1

然后对于 cron 作业,

0,30 * * * * /usr/bin/find /var/www/magento/var/session -type f -mtime +1 -exec rm {} \;

话虽如此,我不确定这就是瓶颈所在,所以也许 mikeserv 的评论会更有帮助。

另外,出于安全原因,您可能应该使用-execdir而不是;-execman find

答案3

我会使用 perl,它比这更快、更有效find + rm

0,30 * * * * cd /var/www/magento/var/session && /usr/bin/perl -e 'for(<sess_*>){((stat)[9]<(unlink))}'

删除每天包含超过 500,000 条日志的日志目录可在约 6 分钟内将其清除。

相关内容