2012-10-09 37 views
3

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

+0

我不明白“然后将它作为参数传递”。你能否编辑这个问题来澄清你期望的输出类型? – tripleee

回答

5

不,你不需要任何额外的过滤。 directory-files确实要一切,即,包括所述过滤到延伸相匹配(例如ext):

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

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

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

*这是正确的答案。 – yPhil

+0

'directory-files-recursively'对于与此文件夹和所有子文件夹中的扩展名匹配的所有文件。 – mihai

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有一些提示。)

+0

http://stackoverflow.com/a/2235401/874188有一个非CL等效。 '(delq nil(mapcar(lambda(filename))(if(eq“ext”(file-name-extension filename))filename nil))(directory-files dir)))' – tripleee

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 
相关问题