使用 rm -rf 更快地删除大量文件(最大大小为 20GB)失败并且有时会卡住?

使用 rm -rf 更快地删除大量文件(最大大小为 20GB)失败并且有时会卡住?

我尝试使用 rm -rf .* 删除子目录,但未能删除子文件夹,最多可处理 5000 个...但无法一次删除 10000 + 子目录,我编写了一个从子目录中删除文件的脚本然后删除一个子目录。

    # loop & print a folder recusively,
print_folder_recurse() {
for i in "$1"/*;do
    if [ -d "$i" ];then
        print_folder_recurse "$i"
        #echo "dir: $i"
    elif [ -f "$i" ]; then
        #echo "file: $i"
        rm -rf $i
    fi
done
#echo "dir: $1"
if [[ "$1" != "$path" ]]; then
    #echo "dir : $1"
    rm -rf $1o
fi

}

注意:此脚本有时也会失败...并且目录大小不一定总是限制为 20 GB...将来可能会增长得更多。

任何一位 Linux 专家知道处理此类问题的更好方法吗?

答案1

问题不在于要删除的内容的大小,而在于它们的数量。

无论您尝试:rm -rf *还是在脚本中,for i in "$1"/*;do:shell 都需要扩展 *,这会导致数千个文件路径被浏览并放入内存中。当数字太大时,它要么会非常慢,要么会失败(并显示错误消息)。

您应该简化并直接 rm -rf "${1:-missing_directory_name}"在脚本中使用 : 作为唯一的命令: rm 将自行处理子文件的发现。

另一种方法是使用find "${1:-missing_directory_name}" - type f -depth -print0 | xargs -0 -n 100 rm,每次 find 输出 100 个文件名时调用 rm ,从而限制添加到 rm 的参数数量,无论有多少个 exat 文件。然后再进行另一个查找,例如:find "${1:-missing_directory_name}" -type f -depth -print0 | xargs -n 100 rmdirrmdir 剩余的目录,从“最深的目录”开始,避免首先尝试删除非空目录。 (但是第一个解决方案用 1 rm 完成所有这些工作,并且最终可能被证明是最有效的)

当脚本运行时,您可以在另一个终端窗口中执行 : multiple: 操作 df -i directory_name,并看到随着目录中的文件被删除,索引节点的数量迅速减少。 (df -i 将显示包含directory_name的文件系统的所有inode,因此它可能不会以0结尾,因为该文件系统的其他文件可能位于其他目录或父目录下。

还有许多其他方法(根据最近的发现,您还有其他方法不使用 xargs 等)。

这个想法保持不变:当扩展的文件数量太大时,不要使用 shell 扩展。

相关内容