高效删除数百万个文件,无需先生成所有要删除的文件列表

Log*_*pto 2 linux performance filesystems rsync delete

我一直在试图弄清楚如何从安装的 NAS 驱动器中删除数百万个文件。我正在访问它的操作系统是 RHEL 7.6。

该目录正在积极写入,每天有数万或数十万个附加文件。

当我尝试运行删除技术时,例如:

rsync -av --delete empty_dir/ millions_of_files_dir/
Run Code Online (Sandbox Code Playgroud)

它首先会使用大量 CPU/MEM,并带有“发送增量文件列表”消息。这种情况会一直持续下去,CPU/MEM 的使用量会慢慢减少到最低限度。

我的理论是,这是因为文件列表永远不会结束;不断有更多的文件被添加。

SO:是否有一种删除技术在删除之前不需要完整的文件列表,但会在找到它们时“流删除”吗?

jor*_*anm 7

使用find带有-delete选项的命令,文件将在找到时被删除,而无需构建完整列表:

find . -type f -delete # deletes all files in the current dir and all subdirs
Run Code Online (Sandbox Code Playgroud)

需要注意的是,大多数 Linux 文件系统在单个目录中处理这么多文件时表现不佳。即使没有构建“完整”列表,仍然需要列出目录的内容,如果它包含数百万个文件,则性能会很差。

  • 至少 `find` 应该以自然顺序读取目录。`ls` 通常首先读取整个目录,以便它可以对列表进行排序。`ls -U` 避免了这种情况。但是,即使您按目录顺序删除,在大多数文件系统中,条目很可能会在您删除后立即重新使用。从长远来看,这种单目录机制似乎站不住脚,切换到午夜目录重命名以对数据进行分区将有很大帮助。 (2认同)