我需要目录中的子目录(而不是文件)列表,以便我可以将其传递给 Java 程序。所以我使用这个命令来获取 Linux 机器上的列表:
find /some_directory -depth -maxdepth 1 -mindepth 1 -exec basename {} \; > listfile.txt
然后我将其listfile.txt
作为参数传递给 Java 程序。从 Java 程序本身获取列表目录存在一些问题,因此我正在这样做。但由于文件数量超过 200k,上述find
命令需要花费大量时间(约 35 分钟)。
可以优化吗或者有更好的选择吗?
答案1
要仅打印文件名而不是路径,使用 GNU1 find
,您可以替换-exec basename
为-printf '%f\n'
.解释于GNUfind
手册页:
%F
删除所有前导目录的文件名(仅最后一个元素)。
另外,如果您只想输出中的目录,您可能应该使用-type d
选项:
find /some_directory -maxdepth 1 -mindepth 1 -type d -printf '%f\n' > listfile.txt
-depth
是多余的,因为您只在一个深度 (1) 查找文件。
和-maxdepth
也是-mindepth
GNU 扩展,但与 相反-printf
,它们现在也出现在其他一些find
实现中。
答案2
如果您想在目录中存储除.
和 之外的条目列表,每行一个,则该命令及其选项的用途如下:..
/some_directory
ls
-A
ls -A /some_directory > listfile.txt
这还有对该列表进行排序的好处(使用 GNU ls
,您可以使用 禁用排序-U
)。
basename
就您而言,这是非常低效的,因为您每个文件运行一个命令。