在包含许多文件的目录上执行时rm -rf /some/folder/*
,服务器性能会显着下降。驱动器是高级 SSD。
尝试了不同的删除文件的方法:find --delete
,rsync
(描述这里)。没有帮助。
根据我的经验,这是一个 Azure 问题。
我所说的“慢”是指 2 分 30 秒内处理 116000 个文件。本地需要1秒。其他服务器提供商也有1-3秒。
有没有一种方法可以快速删除许多文件而不影响服务器的总体性能?
答案1
有没有一种方法可以快速删除许多文件而不影响服务器的总体性能
你可以作弊。不幸的是,它并没有解决问题,而只是将其推开。另一方面,这可能是一个有用的解决方法。
代替
rm -rf /some/folder/*
使用
items=(/some/folder/*) # List of items to delete
prefix=".DELETE_ME.$$"
for item in "${items[@]}"
do
x="$${item%/*}/.$prefix.${item##*/}" # New temporary path for item to delete
mv -f "$item" "$x" || rm -rf "$item" # Rename or delete
done
for item in "${items[@]}"
do
x="$${item%/*}/.$prefix.${item##*/}"
rm -rf "$x" # Delete whatever is left
done >/dev/null 2>&1 & # Run sequentially in background
您可以将其封装在脚本中(使用 解析参数for item in "$@"
),甚至封装为 shell 函数。
我使用了两个循环,而不是可能更明显的“在后台重命名和删除”,这样您就不会因并行的多个删除而破坏服务器性能。它不会阻止那里的影响,但它可以帮助加快删除速度。
答案2
我认为您可能遇到的问题是您正在尝试删除一个目录中的 116000 个文件。删除目录中的 n 个文件需要 n 次方时间。而且它会变得非常慢。甚至ls -l
会find
陷入困境。请注意,直线/bin/ls
仍然相当快,因为它不必访问每个文件。
秘诀在于一开始就不要在一个目录中获取那么多文件。相反,创建多个目录级别。
如果做不到这一点,您只需要等待一段时间即可删除。
答案3
您可以使用-exec rm -rf {} \;
:
find /some/dir/ -type f -exec rm -rf {} \;
该命令将删除目录中的所有文件/some/dir