【问题标题】:How to get file list by extension?如何按扩展名获取文件列表?
【发布时间】:2012-09-29 13:16:45
【问题描述】:

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

【问题讨论】:

  • 我不明白“然后将其作为参数传递”。您能否编辑问题以澄清您期望的输出类型?

标签: elisp


【解决方案1】:

不,您不需要任何额外的过滤。 directory-files 做了您想要的一切,即包括过滤以匹配扩展名(例如ext):

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

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

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

【讨论】:

  • directory-files-recursively 用于此文件夹和所有子文件夹中与扩展名匹配的所有文件。
【解决方案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 有一些提示。)

【讨论】:

  • stackoverflow.com/a/2235401/874188 具有非 CL 等效项。 (delq nil (mapcar (lambda (filename) (if (eq "ext" (file-name-extension filename)) filename nil)) (directory-files dir)))
【解决方案3】:

我的经验法则是每次在 Elisp 中处理文件和文件路径时都使用 f 库。在这里,您需要f-files 来获取目录中的文件列表,并需要f-ext 从文件名中提取扩展名。 -filterremove-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

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 2011-05-16
    • 2012-07-23
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多