我遇到一个问题,一个目录中有大量文件。
文件系统是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