![优化一个删除文件的shell脚本/命令](https://linux22.com/image/47413/%E4%BC%98%E5%8C%96%E4%B8%80%E4%B8%AA%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E7%9A%84shell%E8%84%9A%E6%9C%AC%2F%E5%91%BD%E4%BB%A4.png)
我正在运行 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
而不是;-exec
看man 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 分钟内将其清除。