2012-10-09 36 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 
相關問題