elisp 再帰的にファイルを探す関数って標準ではない?
探してみたけど見付からなかったので、それっぽい動きをする関数を書いてみた。
(defun IK::directory-files-recursively (regexp &optional directory type) (let* ((directory (or directory default-directory)) (predfunc (case type (dir 'file-directory-p) (file 'file-regular-p) (otherwise 'identity))) (files (delete-if (lambda (s) (string-match (rx bol (repeat 1 2 ".") eol) (file-name-nondirectory s))) (directory-files directory t nil t)))) (loop for file in files when (and (funcall predfunc file) (string-match regexp (file-name-nondirectory file))) collect file into ret when (file-directory-p file) nconc (IK::directory-files-recursively regexp file type) into ret finally return ret)))
delete-if使っているので(require 'cl)が必要。
第一引数の正規表現にマッチするfileのリストを返す。
第二引数はdirectory名、省略するとdefault-directoryの値を使う。
第三引数はfileかディレクトリのみを対象にするオプション。
'dir だとディレクトリのみ
'file だとファイルのみ
省略するか、それ以外の値だと、両方を対象にする。