【发布时间】:2012-09-29 13:16:45
【问题描述】:
我想获取目录中所有具有特定扩展名的文件的列表,然后将其作为参数传递。如何在 ELisp 中做到这一点?
【问题讨论】:
-
我不明白“然后将其作为参数传递”。您能否编辑问题以澄清您期望的输出类型?
标签: elisp
我想获取目录中所有具有特定扩展名的文件的列表,然后将其作为参数传递。如何在 ELisp 中做到这一点?
【问题讨论】:
标签: elisp
不,您不需要任何额外的过滤。 directory-files 做了您想要的一切,即包括过滤以匹配扩展名(例如ext):
(directory-files DIRECTORY nil "\\.ext$")
见C-h f directory-files。对于当前目录,可以使用:
(directory-files default-directory nil "\\.ext$")
【讨论】:
directory-files-recursively 用于此文件夹和所有子文件夹中与扩展名匹配的所有文件。
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 有一些提示。)
【讨论】:
(delq nil (mapcar (lambda (filename) (if (eq "ext" (file-name-extension filename)) filename nil)) (directory-files dir)))
我的经验法则是每次在 Elisp 中处理文件和文件路径时都使用 f 库。在这里,您需要f-files 来获取目录中的文件列表,并需要f-ext 从文件名中提取扩展名。 -filter 是 remove-if-not 等效于 dash 列表操作库。因此,您需要的表达式是:
(-filter (lambda (x) (equal (f-ext x) "ext")) (f-files "dir"))
使用anaphoric macros,我们可以通过删除lambda 来做出更简洁的表达(惯例是使用两个破折号表示照应版本):
(--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
【讨论】: