我想获取目录中具有特定扩展名的所有文件的列表,然后将其作为参数传递。如何在ELisp中完成?
答案 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