提高 find -exec 的性能...

aam*_*dmi 3 performance find

我需要目录中的子目录(不是文件)列表,以便我可以将它传递给 Java 程序。所以我使用这个命令来获取 Linux 机器上的列表:

find /some_directory -depth -maxdepth 1 -mindepth 1 -exec basename {} \; > listfile.txt
Run Code Online (Sandbox Code Playgroud)

然后我将listfile.txt其作为参数传递给 Java 程序。从 Java 程序本身获取列表目录存在一些问题,因此我正在这样做。但是上面的find命令需要很多时间(~ 35 分钟),因为有超过 20 万个文件。

这可以优化还是有更好的选择?

seb*_*sth 10

要仅打印文件名而不是路径,使用 GNU¹ find,您可以替换-exec basename-printf '%f\n'. 在GNUfind手册页中解释:

%F

删除任何前导目录的文件名(仅最后一个元素)。

此外,如果您只想要输出中的目录,您可能应该使用-type d选项:

find /some_directory -maxdepth 1 -mindepth 1 -type d -printf '%f\n' > listfile.txt
Run Code Online (Sandbox Code Playgroud)

-depth 是多余的,因为您只能在一个深度 (1) 中找到文件。

¹-maxdepth并且-mindepth也是 GNU 扩展,但与 相反-printf,它们现在也出现在其他一些find实现中。


Sté*_*las 6

如果你想存储条目列表,除了.../some_directory目录中,每行一个,那就是在ls命令中,-A选项是:

ls -A /some_directory > listfile.txt
Run Code Online (Sandbox Code Playgroud)

这也有对该列表进行排序的好处(使用 GNU ls,您可以使用 禁用排序-U)。

在您的情况下,它非常低效,因为您basename每个文件运行一个命令。