批量删除100m小文件

批量删除100m小文件

我需要使用 Ubuntu Linux 18.04 从 SMB 共享中删除超过 1 亿个小文件(8k-300k)

这些文件位于以下文件夹结构中:

/year/month/day/device/filename_[1...10000].jpeg

我尝试过的事情:

rm -rf *- 显然由于参数溢出而失败。

find . -type f -exec rm -f {} \;- 如果我有充足的时间,这个方法会管用,但是速度太慢了

我能想到的唯一有效方法是运行多个并行作业,每个作业删除一部分数据(直到 NAS 的应对能力达到饱和状态)

但是,我不确定如何从 Linux 命令行运行并行命令。我可以使用tmux并生成多个会话,但感觉不太优雅。

我想我也可以把一个放在&一堆命令行的末尾。

有没有办法我可以将其写成一个 shell 脚本来生成多个查找和删除作业/进程?

答案1

我会考虑rm -r folderfind folder -delete。绝对不会使用 find -exec ,因为它会在每个文件上调用命令!

您还可以使用字符类通配符来删除文件,例如rm -rf a[a-h]*- 或者您可以一次只删除一个月或一年的文件夹。如果您同时启动多个删除过程,那么一旦启动更多删除过程,速度就会变慢。

我总是喜欢避免,rm *以防我进入错误的目录/文件夹。还find . -name ‘xx*’应该对大小更加宽容。

完成后,删除并重新创建目录,即使您必须移出文件,因为它会缩小目录本身的大小。

就速度而言,rm -f 或 find -delete 会更快。如果所有文件都在一个平面文件夹中。

另一个经典是find . -print | xargs rm -f- 但这实际上仅在您使用附加find修饰符时才有用。

答案2

我们最终使用了一个可以产生并行任务的脚本

#!/bin/bash

# Spin up find/delete tasks
deleteTask(){
    echo "Contents of $2 - $1 is being deleted";
    time find $1 -delete;
    echo "Contents of $2 - $1 were deleted";
}

#Get the next layer down    
deleteFromSubFolder(){
for folder in $1*; do
  echo $1 - $folder
  deleteTask "$folder" "$1" &
done
}

#Start in the top layer
for folder in */; do
  deleteFromSubFolder "$folder" &
done

答案3

您可以尝试删除文件夹find /year -type d -exec ls -ld {} \;

一旦确定结果,就可以替换ls -ld {}rm -rf {}

相关内容