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 だとファイルのみ
省略するか、それ以外の値だと、両方を対象にする。