尝试删除多个服务器上的数千个文件。
rm
不管用。
编写了一个通用脚本来cron
定期运行删除:
...
/bin/perl -e 'unlink ( <`find ${DIRECTORY} -name "*.${FILETYPE}" -type f -mtime +${DELETE_OLDER_THAN}`> ) or die "Nothing deleted\n" ' >> ${REMOVAL_LOGFILE} 2>&1
...
我想非常具体地说明我要删除的内容。
我使用 perl 因为它似乎比-exec rm {}
:/在这种情况下允许
吗?find
答案1
如果您find
支持该-delete
操作,您会发现它的速度与您所能达到的速度一样快,而无需产生多个删除进程:
find "$DIRECTORY" -name "*.$FILETYPE" -type f -mtime +"$DELETE_OLDER_THAN" \
-delete -print >> "$REMOVAL_LOGFILE" 2>&1
您会发现这-exec rm {} \;
很慢,因为它为每个删除操作创建一个新进程。如果您find
有它,-exec rm {} +
速度会更快,因为它会rm
为大量文件创建一个进程。但所有单线程解决方案中最快的是-delete
.
如果稍微复杂一点,您可以find .. -delete
在目录树中的每个目录中分叉一个进程,并让(至少其中一些)并行运行。但我不知道您正在处理多少个目录,因此我无法确定这是否是净收益。