Ext4 和 Linux - 一个目录中的大量文件 - 操作

Ext4 和 Linux - 一个目录中的大量文件 - 操作

我遇到一个问题,一个目录中有大量文件。

文件系统是ext4。

我达到了 2**32 个文件限制,甚至无法在此分区上写入任何文件。

问题很大。

我不知道如何将某些文件移动到其他资源?

经典的“ls”和“mv”不起作用。文件太多了...

有什么方法可以快速输出bash中的任何文件吗?

每个目录一个任意文件,差不多是2**32个文件。

如果我可以快速下载一个文件,我就可以编写一个脚本。

有任何想法吗?

答案1

请尝试运行:

ls --sort=none --no-group

或限制一定数量的文件,例如

ls --sort=none --no-group | head -500

答案2

使用ls对大目录进行操作效率非常低,因为 GNUls会读取全部返回之前目录中的条目任何其中,即使使用--sort=none,因为它希望输出“漂亮”。这既慢又占用大量 RAM,因为 ext4 目录中可能包含数百万个文件。

相反,您应该使用find列出目录中的文件,一旦从目录中读取文件名,它将打印出文件名。如果您想查找特定文件(例如所有小于 1MB 的“*.jpg”文件),您可以运行例如

find /my/directory -type f -name "*.jpg" -size -1M

请参阅查找(1) 手册页有关如何使用它的完整详细信息。

一旦找到一堆要处理的文件,您就可以为xargs每个文件运行命令。例如,要删除临时文件,请使用:

find /my/directory -name "*.tmp" -type f -print0 | xargs -0 rm

或者将它们移动到不同的目录中,例如:

find /my/directory -name "*.jpg" -print0 | xargs -0 -I '{}' mv '{}' /my/otherdirectory

或任何数量的事情。该xargs程序针对从标准输入读取的每个文件运行特定命令,请参阅xargs(1) 手册页了解详情。该mv命令稍微复杂一些,rm因为mv需要将目标目录放在命令末尾,而xargs通常将所有文件添加到指定命令之后。

您可以将文件列表保存到输出文件中,例如find ... > /tmp/file_list,然后进行编辑file_list以仅包含要删除/移动的文件,并将其xargs单独通过管道传输到:

xargs -a /tmp/file_list -I '{}' mv '{}' /my/otherdir

相关内容