Bash - 删除大目录中的文件

问题描述 投票:0回答:1

我必须删除非常大的目录(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 分钟。 我可以改进吗?

非常感谢

我正在寻找更快的解决方案

bash performance loops delete-file
1个回答
0
投票

需要花费大量时间的是遍历目录来搜索要删除的文件。为了加快脚本速度,您应该使用单个

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/
© www.soinside.com 2019 - 2024. All rights reserved.