我必须删除非常大的目录(500k 文件)中的文件。 我读取了另一个文件中的文件名,然后尝试了这样的循环:
while IFS=";" read -r Idt surname
do
Echo $idt " " $surname
#Supress leading 0 and delete
find $DataPath/target/ -type f -name Fiche_"$((10#$idt))".* -delete
done < <(cut -d ";" -f 3,6 $DataPath/*deletedFiles.txt)
这段代码可以工作,但速度非常慢,在我的 Linux 服务器上每个文件超过 2 分钟。 我可以改进吗?
非常感谢
我正在寻找更快的解决方案
需要花费大量时间的是遍历目录来搜索要删除的文件。为了加快脚本速度,您应该使用单个
Idt
调用删除多个 find
。这有点乏味,但可能。
我使用
awk
构建 -o -name Fiche_XXX.*
命令所需的 find
三元组,然后将它们作为“单参数”提供给 xargs
;然后用一些黑魔法重新分割这些三元组并最终调用 find
命令:
awk -F';' '{ printf("-o -name Fiche_%d.*%c", $3, 0) }' "$DataPath"/*deletedFiles.txt |
xargs -0 sh -c '
printf %s\\n "$@" |
xargs find "$0" -type f -name . "$@" -delete
' "$DataPath"/target/