我有一个目录,其中快速生成大量缓存文件。由于这些文件非常小,因此它很快就会消耗掉我的所有索引节点。
目前我正在运行以下命令来查找所有超过 12 小时的文件并将其删除。
$ find ./cache -mtime +0.5 -exec rm {} \;
但此命令删除的速度比生成文件的速度慢。有人可以告诉我一些快速删除大量文件的替代方法吗?
答案1
find … -exec rm {} \;
rm
对每个文件执行命令。尽管启动一个新进程非常快,但它仍然比单纯删除文件慢很多。
find … -exec rm {} +
会rm
批量调用,这要快得多:您支付rm
每个批次运行一次的成本,并且每个批次执行多次删除。
甚至更快的是rm
根本不调用。 Linux 上的命令具有删除匹配文件的find
操作。-delete
find ./cache -type f -mtime +0.5 -delete
但是,如果您以无法跟上的速度生成文件find … -exec rm {} \;
,则您的设置可能有问题。如果cache
包含数百万个文件,您应该将其拆分为子目录以便更快地访问。
答案2
尝试使用xargs
:
find ./cache -mtime +0.5 -print0 | xargs -0 rm -f
更新@pradeepchhetri 的解释
如果使用find
with -exec
,则找到的每个文件find
都会调用rm
一次。因此,如果您发现大量文件,即 10000 个文件,您就调用了rm
10000 次。
xargs
会将 的输出find
视为 的命令参数rm
,这样,xargs 将提供rm
一次可以处理的尽可能多的参数,即rm -f file1 file2 ...
这样可以减少 fork 调用,使程序运行得更快。
答案3
虽然 find 是最好的(最简单、惯用的)方法,
find $dir -exec rm {} +
您可以将该目录移到一边,创建一个新目录(为您的程序),然后删除...
mv $idr old$dir && mkdir $dir && rm -rf old$dir
但也许您的问题是创建了太多文件。为什么不更改您的程序以附加到现有文件,而不是创建一个新文件?然后你可以将这个(日志文件)移到一边,然后你的程序可以创建/附加到一个新文件,例如,
fd = open("logfile","a+");
答案4
如果您只是想尽快删除许多文件ls -f1 /path/to/folder/with/many/files/ | xargs rm
可能没问题,但最好不要在生产系统上运行它,因为您的系统可能会出现 IO 问题,并且应用程序可能会在删除操作期间卡住。
该脚本适用于许多文件,并且不会影响系统的 ioload。
#!/bin/bash
# Path to folder with many files
FOLDER="/path/to/folder/with/many/files"
# Temporary file to store file names
FILE_FILENAMES="/tmp/filenames"
if [ -z "$FOLDER" ]; then
echo "Prevented you from deleting everything! Correct your FOLDER variable!"
exit 1
fi
while true; do
FILES=$(ls -f1 $FOLDER | wc -l)
if [ "$FILES" -gt 10000 ]; then
printf "[%s] %s files found. going on with removing\n" "$(date)" "$FILES"
# Create new list of files
ls -f1 $FOLDER | head -n 5002 | tail -n 5000 > "$FILE_FILENAMES"
if [ -s $FILE_FILENAMES ]; then
while read FILE; do
rm "$FOLDER/$FILE"
sleep 0.005
done < "$FILE_FILENAMES"
fi
else
printf "[%s] script has finished, almost all files have been deleted" "$(date)"
break
fi
sleep 5
done