我想从特定点递归地走下目录结构,并在每个级别调用copyright-update-directory。
Emacs 24中是否包含有助于此功能的功能?例如:
(recursive-directory-walk "~/src/foo" '(copyright-update-directory))
如果不存在这样的函数,那么开始实现这个(或工作实现)的一些指示就会很棒。
答案 0 :(得分:4)
MELPA上的f.el库(github)包含文件系统遍历的函数。
(mapc 'copyright-update-directory (f-directories "~/path" nil t))
这将以递归方式下降目录层次结构。请参阅f-directories的文档。
答案 1 :(得分:3)
不确定是否存在,但不难写自己的。
(defun folder-dirs (folder)
(delete-if-not 'file-directory-p
(mapcar (lambda(arg) (file-name-as-directory (concat (file-name-as-directory folder) arg)))
(delete-if (lambda (arg) (or (string= ".." arg) (string= "." arg)))
(directory-files folder)))))
(defun recursively-run-on-every-dir (fn folder)
"FN - function, taking one argument;
FOLDER - initial forder"
(funcall fn folder)
(mapc (lambda(arg) (recursively-run-on-every-dir fn arg))
(folder-dirs folder))
nil)
;; use your function instead of print
(recursively-run-on-every-dir 'print "/your/initial/path/")
答案 2 :(得分:2)
只需使用find-lisp
(require 'find-lisp)
;; a simple function, just to test
(defun my-funct (x)
(princ x)
(terpri))
(mapc 'my-funct (find-lisp-find-files "~/src/foo/" "\\.txt$"))
答案 3 :(得分:1)
我认为Chris Barrett's answer是正确且惯用的。但是,出于学习目的,我想实现Python os.walk
,这是广度优先遍历目录树的一般功能。我使用了dash.el
列表库和f.el
文件和目录库。这是一个基于堆栈的实现translated from Python。
(defun walk (path)
(let ((stack (list (f-full path)))
result)
(while stack
(let* ((path (pop stack))
(ds_ (f-directories path))
(ds (-map 'f-relative ds_))
(fs (-map 'f-relative (f-files path))))
(--each ds_ (!cons it stack))
(!cons (list path ds fs) result)))
(reverse result)))
参见函数:f-full
,pop
,f-directories
,f-relative
,f-files
,--each
,!cons
,{{ 3}}。现在,您可以在循环中使用它,就像在Python中使用它一样:
(loop for (b ds fs) in (walk path)
do (copyright-update-directory b "*"))
答案 4 :(得分:1)
Emacs为此目的具有内置函数directory-files-recursively:
(mapc #'YOUR-FUNCTION
(remove-if-not
#'file-directory-p ;only dirs
(directory-files-recursively YOUR-DIRECTORY "" t)))
它也比其他答案中提到的f-directories函数快得多,因为它没有使用内部递归。