2009-09-24 215 views
1

我想遍历给定的目录并创建一个以.jpg结尾的文件列表。遍历目录树

(setq files (list)) 

(defun jpg-list(directory) 
    (dolist (node (directory-files directory t)) 
     (if (file-directory-p node)  
      (if (not 
      (string= (substring node (- (string-width node) 1)) ".")) 
      (jpg-list node)) 
    (if (string-match ".jpg" node) 
     (setq files (cons node files))))) 
    files) 

我想这样做,而不使用外部变量(文件)。在elisp中做这件事的惯用方式是什么?

回答

4

这里是我的功能的解决方案:

(defun jpg-list (dir) 
    (if (file-directory-p dir) 
     (append 
     (directory-files dir t ".jpg$") 
     (apply 'append (mapcar 'jpg-list (directory-files dir t "[^.]+")))))) 
5

最好的办法是使用'directory-files全接口,只需使用:

(directory-files directory t ".jpg$") 

更大的问题是如何避免顶层变量,它通常是由'let声明,例如解决

(defun jpg-list (directory) 
    (let ((files)) 
    ...do something with files... 
    files)) 
+0

感谢,这解决了我的问题。但是对于不同的情况,编写这种循环的习惯方式是什么?使用setq遍布各处似乎没有功能代码? – 2009-09-24 19:54:21

+0

如果你想要一个更“功能性”的方法,你可能想用lambda表示你的(目录文件)mapcar,它递归地调用你的函数在subdirs上。 – aaron 2009-09-24 21:58:57

+1

对,mapcar功能更强大,但并没有解决他的问题。你需要像'remove-if','remove'等''cl'中的例程,这完全取决于你在做什么。惯用的方式是完全使用“目录文件”。接下来的方法是通过“let”使用局部变量,你可以编写一个递归例程,使用''cl'函数等等等等。注意:Emacs不起作用,它是充满了各种各样的副作用... – 2009-09-24 22:48:19