Listen Sie rekursiv alle Dateien und Unterverzeichnisse auf

15

Gibt es eine Möglichkeit, möglicherweise mithilfe eines Pakets, alle Dateien (mit Pfaden) und Unterverzeichnisse (oder zumindest die leeren Unterverzeichnisse ) rekursiv aufzulisten, da die Pfade zu den nicht leeren Pfaden aus den Pfaden von ermittelt werden können? die darin enthaltenen Dateien) des aktuellen Verzeichnisses?

Am ehesten finde ich die projectile-find-fileFunktion des projectilePakets (alternativ die helm-projectile-find-fileFunktion des helm-projectilePakets), aber es scheint nicht in der Lage zu sein, leere Ordner aufzulisten. Darüber hinaus scheint es nur mit Git und anderen Versionskontroll-Repositorys zu funktionieren, aber möglicherweise gibt es eine Problemumgehung für diese Einschränkung.

Evan Aad
quelle
2
bin mir nicht ganz sicher, was du versuchst, aber [dieser Blogeintrag] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) könnte enthalten, was du brauchst, oder Sie versuchen [dieses] (ergoemacs.org/emacs/elisp_traverse_dir.html) als Starter.
Theldoria
Was meinst du mit "Liste"? Möchten Sie Emacs Lisp-Funktionen, die eine Liste von Zeichenfolgen mit den Pfaden zurückgeben? Möchten Sie einen Puffer mit den Pfaden, z. B. einem pro Zeile? Möchten Sie einen Zielpuffer mit allen Dateien? (Das letzte ist einfach, fügen Sie "-R" zu den ls-Schaltern in dired.)
Omar
Siehe auch Relative Dateinamen rekursiv in Emacs
Håkon Hægland
@Omar: Ich muss ideale Voraussetzungen erfüllen: (1) dass es entweder Teil von Emacs oder Teil eines Pakets ist, (2) dass es entweder mit helmoder funktioniert ivy, dh dass die Ergebnisse in einem helmoder ivyPuffer angezeigt werden . Wenn es nicht möglich ist, beide Anforderungen zu erfüllen, ist die zweite für mich wichtiger.
Evan Aad
1
Das sind wirklich zwei verschiedene Fragen. Aber OK, ich habe für jeden eine Antwort gegeben.
Drew

Antworten:

8

Vorausgesetzt, Sie verwenden ivy, können Sie diese Funktion verwenden

    (defun fhd/counsel-everything ()
      "list everything recursively"
      (interactive)
      (let* ((cands (split-string
                     (shell-command-to-string "find .") "\n" t)))
        (ivy-read "File: " cands
                  :action #'find-file
                  :caller 'fhd/counsel-everything)))
fhdhsni
quelle
Vielen Dank. Was ist, wenn ich benutze helm?
Evan Aad
1
Entschuldigung, ich weiß es nicht helm. ivyist ziemlich leicht. Probieren Sie es aus.
FHDHSNI
13

Verzeichnis-Dateien-rekursiv

(Ich denke, das wurde in Emacs 25 hinzugefügt)

Hier ist der Link zum Handbuch: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Gibt alle Dateien unter dem Verzeichnis zurück, deren Namen mit regexp übereinstimmen. Diese Funktion durchsucht das angegebene Verzeichnis und seine Unterverzeichnisse rekursiv nach Dateien, deren Basisnamen (dh ohne die führenden Verzeichnisse) mit dem angegebenen regulären Ausdruck übereinstimmen, und gibt eine Liste der absoluten Dateinamen der übereinstimmenden Dateien zurück (siehe absolute Dateinamen). . Die Dateinamen werden in der Reihenfolge zurückgegeben, in der sie zuerst eingegeben wurden. Dies bedeutet, dass Dateien in einem Unterverzeichnis vor den Dateien im übergeordneten Verzeichnis zurückgegeben werden. Darüber hinaus werden übereinstimmende Dateien in jedem Unterverzeichnis alphabetisch nach ihren Basisnamen sortiert. Standardmäßig werden Verzeichnisse, deren Namen mit regexp übereinstimmen, in der Liste nicht aufgeführt. Wenn das optionale Argument include-directory jedoch nicht nil ist, werden sie eingeschlossen.

Beispiel

(directory-files-recursively default-directory "")
wvxvw
quelle
Es werden keine leeren Verzeichnisse gefunden
fhdhsni
1
@fhdhsni hast du versucht include-directoriesauf einzustellen t? Ich arbeite an Emacs 24 und kann dies momentan nicht ausprobieren, aber ich kann es in wenigen Stunden zu Hause testen.
wvxvw
Mein Fehler. Das habe ich nicht gemacht Vielleicht möchten Sie es in Ihre Antwort aufnehmen.
FHDHSNI
4

In dieser Antwort wird davon ausgegangen, dass Sie eine Liste der Datei- und Verzeichnisnamen anzeigen möchten , anstatt eine Lisp-Liste zu erhalten.

Verwendung Standard Emacs Befehle find-dired, find-name-diredoder find-grep-dired. Die gefundenen Datei- und Verzeichnisnamen werden in einem Verzeichnismoduspuffer angezeigt. (Sie können die ganze Kraft von Dired einsetzen, um an den Ergebnissen zu arbeiten.)

Wenn Sie eine Bibliothek verwenden find-dired+.el, haben Sie erweiterte Versionen dieser Standard-Emacs-Befehle. Plüsch, Sie haben einen Befehl find-time-dired, der Dateien findet, die neuer oder älter als ein bestimmter Zeitstempel sind.

Drew
quelle
find-diredist genau das, wonach ich suche, aber gibt es eine Möglichkeit, nur Namen zu drucken? Weil ansonsten ein einziger Dateiname ohne Grund mehrere Zeilen braucht, da mir Größe, Datum oder Berechtigungen von Dateien absolut egal sind. Ich habe versucht , läuft (setcar find-ls-option "-printf '%p\n'")vor find-dired, aber aus irgendeinem Grund auf diese Weise Dired nicht wollen , eine Datei öffnen beim Drücken Geben Sie ein Element über.
Hi-Angel
2
@ Hi-Angel: Der Puffer, in dem die Ergebnisse angezeigt werden, befindet sich im Dired-Modus. Sie können also einfach (drücken, um mehr als die Dateinamen ein- oder auszuschalten. Ich lasse es die meiste Zeit ausgeschaltet (es werden keine Details angezeigt) und schalte es nur kurz ein, wenn ich einige Details überprüfen möchte.
Drew
1

Siehe https://github.com/technomancy/find-file-in-project

Es gibt Befehle zum Suchen von Dateien oder Verzeichnissen. Aber nicht beide.

Wenn Sie nur alle Unterverzeichnisse und Dateien rekursiv in einem Puffer auflisten möchten, gibt es in Emacs seit Ewigkeiten zwei Befehle:

  1. M-x find-dired. Es hängt vom CLI-Tool ab find. Unter Windows müssen Sie Cygwin oder MYSYS installierenfind

  2. M-x find-lisp-find-dired. Gleich wie find-diredaber in Lisp geschrieben. Es besteht also keine Abhängigkeit von Dritten. Außerdem kann es das Gebietsschema sofort erkennen. Aber es ist langsamer alsfind-dired

chen bin
quelle
Mein Anwendungsfall ist derselbe wie derjenige, der den UNIX-Shell-Befehl lsoder die Emacs-Funktion verwendet find-file. Beide listen sowohl Dateien als auch Verzeichnisse auf, einschließlich leerer Verzeichnisse.
Evan Aad
Sind find-diredund find-lisp-find-diredrekursiv, dass sie nicht nur den Inhalt des aktuellen Verzeichnisses auflisten, sondern auch die Inhalte von jedem seiner Unterverzeichnisse, Sub-Sub-Verzeichnisse, usw.?
Evan Aad
Ja, rekursiv
Chen Bin
1

In dieser Antwort wird davon ausgegangen, dass Sie eine Lisp-Liste der Datei- und Verzeichnisnamen erhalten möchten , anstatt eine Liste von ihnen anzuzeigen.

Wenn Sie die Bibliothek Dired + verwenden , können Sie die Funktion verwenden diredp-files-within. (Sie müssen sich nicht in einem Dired-Puffer befinden, um ihn zu verwenden.)

Dies funktioniert mit jeder Emacs-Version und ist allgemeiner als directory-files-recursively.

  • Sie können eine Liste von Dateien und Verzeichnissen übergeben, die jeweils rekursiv ausgeführt werden.

  • Oder Sie können eine Funktion übergeben , die eine solche Liste zurückgibt.

    • Wenn es einen gerichteten Puffer für ein Verzeichnis gibt, das verarbeitet wird, wird die Funktion in diesem Puffer aufgerufen, um die Liste der einzuschließenden Dateien zurückzugeben.

      Wenn die Funktion beispielsweise ist, werden dired-get-marked-files nur die markierten Dateien und Unterverzeichnisse einbezogen.

  • Sie können ein Prädikat übergeben , dem jede Datei oder jedes Verzeichnis entsprechen muss. Regexp Matching ist natürlich eine Art von Prädikat.

  • Sie können ihm sagen, dass er symbolischen Links nicht folgen soll.

Drew
quelle
0
(definiere meine-dir-Liste (Quelle)
  ;;
  ;; Listendateien im aktuellen Puffer drucken
  ;;
  ;; Nicht getestet, Systemtyp: gnu
  ;; Getestet, Systemtyp: Windows-NT
  ;;
  (interaktives "sDirectory:")
  (let ((n 0)
    (l-Datei-Verzeichnis (und (CD-Quelle) (Verzeichnis-Dateien-und-Attribute "./")))
    (Verzeichnis '())
    (Dateiliste '())
    )
    (princ (Format "% s \ n" Standardverzeichnis) (aktueller Puffer))
    (während l-file-dir
      (if (nth 1 (auto l-dateiverzeichnis))
      (setq n (1+ n)
        dir-list (cons ((Lambda (Quelle)
                  (und (nicht (Zeichenfolge-Präfix-p "." (Autoquelle))) Quelle))
                (auto l-dateiverzeichnis)) dir-liste)
        )
    (princ (format "% s \ n" (konkretes Standardverzeichnis
                      (und (String-Übereinstimmung "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-file-dir))) (current-buffer))
    )
      (setq l-dateiverzeichnis (cdr l-dateiverzeichnis))
      )
    (while (caar dir-list)
      (setq dir-liste (cdr dir-liste))
      (cd "..")
      )
    )
  'in Ordnung
  )
Joe
quelle