]> git.eshelyaron.com Git - emacs.git/commitdiff
Implement a new function directory-files-recursively
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 9 Dec 2014 06:20:53 +0000 (07:20 +0100)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 9 Dec 2014 06:21:17 +0000 (07:21 +0100)
* doc/lispref/files.texi (Contents of Directories): Document
directory-files-recursively.

* etc/NEWS: Mention directory-files-recursively.

* lisp/files.el (find-files): New function.

doc/lispref/ChangeLog
doc/lispref/files.texi
etc/ChangeLog
etc/NEWS
lisp/ChangeLog
lisp/files.el

index d8215be6b156edf5e41c4bf9d9990241809eadd4..e7b5606b681189b1b1e57f242c88f2a24f41560c 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * files.texi (Contents of Directories): Document
+       directory-files-recursively.
+
 2014-12-04  Eli Zaretskii  <eliz@gnu.org>
 
        * display.texi (Bidirectional Display): Document
index ac77b94d8f6b7ef0f149e6920641b69761b56627..92bb718e46a8f7ad2e6bfb04d0f59ff92f22e1e8 100644 (file)
@@ -2605,6 +2605,14 @@ An error is signaled if @var{directory} is not the name of a directory
 that can be read.
 @end defun
 
+@defun directory-files-recursively directory match &optional include-directories
+Return all files under @var{directory} whose file names match
+@var{match} recursively.  The file names are returned ``depth first'',
+meaning that contents of sub-directories are returned before contents
+of the directories.  If @var{include-directories} is non-@code{nil},
+also return directory names that have matching names.
+@end defun
+
 @defun directory-files-and-attributes directory &optional full-name match-regexp nosort id-format
 This is similar to @code{directory-files} in deciding which files
 to report on and how to report their names.  However, instead
index 309c01fe51f3d65677124ffb1c3ebc846f0c9d12..9ac0d0040c2115dbda8b2e1914ff6c167c9d9c3c 100644 (file)
@@ -1,3 +1,7 @@
+2014-12-09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * NEWS: Mention directory-files-recursively.
+
 2014-12-08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * NEWS: Mention the new eww `S' command.
index 4bca9e9ebc187f21dcaa8b3597cd10b16797cf6c..58a5836a1c03da6853560ab21f38445f043d2033 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -137,6 +137,9 @@ buffers to allow certain parts of the text to be writable.
 to all the files and subdirectories of a directory, similarly to the C
 library function `ftw'.
 
+** A new function `directory-files-recursively' returns all matching
+files (recursively) under a directory.
+
 \f
 * Editing Changes in Emacs 25.1
 
index cadb2094b5fe298d7c5925a14b2a8705b184c638..9c044c3a3b6404fd37d182215cd6eb1167698084 100644 (file)
@@ -1,5 +1,7 @@
 2014-12-09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+       * files.el (find-files): New function.
+
        * net/shr.el (shr-dom-print): Don't print comments.
        (shr-tag-svg): Give inline SVG images the right type.
 
index 0f54a22d61e2d2e71a883f91f484e842dcf5cd29..5127519732d751d228fa9bdcd97466be5e48a0e8 100644 (file)
@@ -762,6 +762,27 @@ prevented.  Directory entries are sorted with string-lessp."
                (file-name-nondirectory dir)
                args))))
 
+(defun directory-files-recursively (dir match &optional include-directories)
+  "Return all files under DIR that have file names matching MATCH (a regexp).
+This function works recursively.  Files are returned in \"depth first\"
+and alphabetical order.
+If INCLUDE-DIRECTORIES, also include directories that have matching names."
+  (let ((result nil)
+       (files nil))
+    (dolist (file (directory-files dir t))
+      (let ((leaf (file-name-nondirectory file)))
+       (unless (member leaf '("." ".."))
+         (if (file-directory-p file)
+             (progn
+               (when (and include-directories
+                          (string-match match leaf))
+                 (push file files))
+               (setq result (nconc result (directory-files-recursively
+                                           file match include-directories))))
+           (when (string-match match leaf)
+             (push file files))))))
+    (nconc result (nreverse files))))
+
 (defun load-file (file)
   "Load the Lisp file named FILE."
   ;; This is a case where .elc makes a lot of sense.