删除大量文件的更快方法

删除大量文件的更快方法

我有一个目录,其中快速生成大量缓存文件。由于这些文件非常小,因此它很快就会消耗掉我的所有索引节点。

目前我正在运行以下命令来查找所有超过 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 的解释

如果使用findwith -exec,则找到的每个文件find都会调用rm一次。因此,如果您发现大量文件,即 10000 个文件,您就调用了rm10000 次。

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

相关内容