如何通过扩展名获取文件列表?

时间:2012-10-09 08:44:54

标签: elisp

我想获取目录中具有特定扩展名的所有文件的列表,然后将其作为参数传递。如何在ELisp中完成?

3 个答案:

答案 0 :(得分:6)

不,您不需要任何额外的过滤。 directory-files执行您想要的 所有内容 ,即包含与扩展名匹配的过滤内容(例如ext):

(directory-files DIRECTORY nil "\\.ext$")

请参阅C-h f directory-files。对于当前目录,您可以使用:

(directory-files default-directory nil "\\.ext$")

答案 1 :(得分:2)

directory-files以列表形式检索目录中的所有文件。 remove-if-not删除与谓词不匹配的列表条目。

(require 'cl)
(remove-if-not (lambda (filename) (eq "ext" (file-name-extension filename)))
               (directory-files dir) )

(我很想避开那里的(require 'cl)http://emacswiki.org/emacs/ElispCookbook#toc38有一些提示。)

答案 2 :(得分:0)

我的经验法则是每次使用Elisp中的文件和文件路径时都使用f库。在这里,您需要f-files来获取目录中的文件列表,并f-ext从文件名中提取扩展名。 -filter是来自dash列表操作库的remove-if-not等效项。因此,您需要的表达式是:

(-filter (lambda (x) (equal (f-ext x) "ext")) (f-files "dir"))

使用anaphoric macros,我们可以通过删除lambda来做出更简洁的表达(惯例是使用2个破折号作为照应版本):

(--filter (equal (f-ext it) "ext") (f-files "dir"))

但是f-files接受已经过滤文件列表的自定义函数,那么为什么不放弃-filter

(f-files "dir" (lambda (x) (equal (f-ext x) "ext")))
(f--files "dir" (equal (f-ext x) "ext")) ; anaphoric version