2010-08-18 4 views
25

Gibt es eine Bibliothek oder Funktion, die eine Bash-ähnliche Glob-Erweiterung für Emacs Lisp durchführt?emacs lisp Auflistung von Dateien mit Glob-Erweiterung

Zum Beispiel:

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

Wenn es nicht eine solche Funktion gibt es einen Hinweis/Vorschläge, wie sie umzusetzen?

EDIT:

ich im docs auch eine nützliche Funktion gefunden haben, die ganz genau dies tut:

Datei-expand-Platzhalter: dieser Funktion wird das Wildcard-Muster Muster erweitert, eine Rückkehr Liste der Dateinamen, die zu ihm passen.

+2

Danke - Datei-expand-Wildcards ist genau das, was ich wollte – Greg

Antwort

19

Schauen Sie sich die Dokumentation für directory-files:

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

Hinweis: Das dritte Argument ist ein regulärer Ausdruck - nicht Globbing.

Es ist einfach, Globbing-Muster in reguläre Ausdrücke zu verwandeln. eshell mit einem Übersetzungspaket kommt, die Sie verwenden können:

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

Und wenn Sie zu Eshell ist Globbing (mit Verzeichnissen) volle Belichtung wollen, gibt es wahrscheinlich eine Art und Weise zu bekommen. Das obige nimmt an, dass der Globbing-Teil in dem Nicht-Verzeichnis-Teil des Pfades ist.

+0

Vielen Dank für die klare Erklärung und die weiteren Ideen! – pygabriel

3

Das Paket f fügt eine große Anzahl von Datei- und Dateipfad-Manipulationsfunktionen unter einem konsistenten Namensschema hinzu. Es hat eine Funktion f-glob, die genau das tut:

(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") 
9

nicht sicher, warum dies vielleicht übersehen wurde es nicht in Emacs im Jahr 2010 war aber in einem aktuellen Emacs zumindest gibt es Funktion file-expand-wildcards

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

die tut genau was du willst ..

+0

Oh, ich sah die Bearbeitung des Q, die das bereits beinhaltet, aber da ich es hier übersehen habe, werde ich meine Antwort trotzdem hinterlassen –