36

Are there any library or function that performs a bash-like glob expansion for emacs lisp?

For example:

(directory-files-glob "~/Desktop/*")
> ("/home/user/Desktop/file1" "/home/user/Desktop/file2")

If there isn't such a function are there any hint/suggestion on how to implement it?

EDIT:

I've found in the docs also an useful function that does quite exactly this:

file-expand-wildcards: This function expands the wildcard pattern pattern, returning a list of file names that match it.

pygabriel
  • 9,840
  • 4
  • 41
  • 54

3 Answers3

23

Not sure why this was overlooked maybe it was not in emacs in 2010 but in a current emacs at least there is function file-expand-wildcards

(file-expand-wildcards "~/Desktop/*")

which does exactly what you want to do..

Peer Stritzinger
  • 8,232
  • 2
  • 30
  • 43
22

Check out the documentation for directory-files:

(directory-files "~/Desktop" nil ".")

Note: The third argument is a regular expression - not globbing.

It is straight forward to turn globbing patterns into regular expressions. eshell comes with a translation package which you can use:

(require 'em-glob)
(defun directory-files-glob (path)
   (directory-files (file-name-directory path) 
                    nil 
                    (eshell-glob-regexp (file-name-nondirectory path))))

And, if you want full exposure to eshell's globbing (with directories), there's probably a way to get that. The above assumes that the globbing part is in the non-directory portion of the path.

Trey Jackson
  • 73,529
  • 11
  • 197
  • 229
5

Package f adds a huge amount of file and filepath manipulation functions under a consistent naming scheme. It has a function f-glob that does exactly that:

(f-glob "~/doc/*.org") ; returns a list of files ending with ".org"
(f-glob "*.org" "~/doc/") ; they all behave the same
(f-glob "*.org" "~/doc")
Mirzhan Irkegulov
  • 17,660
  • 12
  • 105
  • 166