Liste récursivement tous les fichiers et sous-répertoires


15

Existe-t-il un moyen, éventuellement en utilisant un package, de lister récursivement tous les fichiers (avec des chemins) et sous-répertoires (ou au moins les sous-répertoires vides , puisque les chemins vers les non-vides peuvent être glanés à partir des chemins de les fichiers qui y sont contenus) du répertoire courant?

Le plus proche que j'ai pu trouver est la projectile-find-filefonction du projectilepackage (alternativement, la helm-projectile-find-filefonction du helm-projectilepackage), mais il ne semble pas pouvoir lister les dossiers vides. En outre, il semble fonctionner uniquement avec Git et d'autres référentiels de contrôle de version, mais il peut y avoir une solution pour cette limitation.


2
Je ne sais pas exactement ce que vous essayez de faire, mais [ce billet de blog] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) peut contenir ce dont vous avez besoin, ou vous pouvez essayer [celui-ci] (ergoemacs.org/emacs/elisp_traverse_dir.html) en entrée.
theldoria

Qu'entendez-vous par «liste»? Voulez-vous une fonction Emacs Lisp qui retourne une liste de chaînes avec les chemins? Voulez-vous un tampon avec les chemins d'accès, disons, un par ligne? Voulez-vous un tampon dired avec tous les fichiers? (Ce dernier est facile, ajoutez "-R" aux commutateurs ls en dired.)
Omar


@Omar: J'ai des exigences idéales: (1) que ce soit une partie d'Emacs ou une partie d'un paquet, (2) qu'il fonctionnera avec l'un helmou l' autre ivy, c'est-à-dire que les résultats seront affichés dans un tampon helmou ivy. S'il est impossible de satisfaire les deux exigences, la 2e est plus importante pour moi.
Evan Aad

1
C'est vraiment deux questions différentes. Mais OK, j'ai fourni une réponse pour chacun.
Drew

Réponses:


8

En supposant que vous utilisez, ivyvous pouvez utiliser cette fonction

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

Merci. Et si j'utilise helm?
Evan Aad

1
Désolé, je ne sais pas helm. ivyest assez léger. Donnez-lui un coup de feu.
fhdhsni

13

répertoire-fichiers-récursivement

(Je pense que cela a été ajouté dans Emacs 25)

voici le lien vers le manuel: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Renvoie tous les fichiers sous le répertoire dont les noms correspondent à regexp. Cette fonction recherche récursivement dans le répertoire spécifié et ses sous-répertoires les fichiers dont les noms de base (c'est-à-dire sans les répertoires principaux) correspondent à l'expression rationnelle spécifiée et renvoie une liste des noms de fichiers absolus des fichiers correspondants (voir noms de fichiers absolus) . Les noms de fichiers sont renvoyés par ordre de priorité, ce qui signifie que les fichiers d'un sous-répertoire sont retournés avant les fichiers de son répertoire parent. De plus, les fichiers correspondants trouvés dans chaque sous-répertoire sont triés par ordre alphabétique selon leurs noms de base. Par défaut, les répertoires dont les noms correspondent à regexp sont omis de la liste, mais si l'argument facultatif include-répertoires n'est pas nul, ils sont inclus.

Exemple

(directory-files-recursively default-directory "")

Il ne trouve pas de répertoires vides
fhdhsni

1
@fhdhsni avez - vous essayé la mise include-directoriesà t? Je travaille sur Emacs 24 et je ne peux pas l'essayer pour le moment, mais je peux tester cela à la maison en quelques heures.
wvxvw

Ma faute. Je ne l'ai pas fait. Vous voudrez peut-être l'inclure dans votre réponse.
fhdhsni

4

Cette réponse suppose que vous souhaitez afficher une liste des noms de fichiers et de répertoires, au lieu d'en obtenir une liste Lisp.

Utilisation commandes standard Emacs find-dired, find-name-diredou find-grep-dired. Les noms de fichiers et de répertoires trouvés sont affichés dans un tampon en mode fatigué. (Vous pouvez utiliser toute la puissance de Dired pour travailler sur les résultats.)

Si vous utilisez la bibliothèque, find-dired+.elvous avez des versions améliorées de ces commandes Emacs standard, en plus vous avez une commande find-time-dired, qui trouve des fichiers plus récents ou plus anciens qu'un horodatage donné.


find-diredest exactement ce que je recherche, mais existe-t-il un moyen d'imprimer uniquement les noms? Parce qu'autrement, un nom de fichier unique prend plusieurs lignes sans raison, car je ne me soucie absolument pas de la taille, de la date ou des autorisations des fichiers. J'ai essayé de courir (setcar find-ls-option "-printf '%p\n'")avant find-dired, mais pour une raison quelconque, dired ne veut pas ouvrir un fichier en appuyant sur Entrée sur un élément.
Hi-Angel

2
@ Hi-Angel: Le tampon dans lequel les résultats sont affichés est en mode Dired. Vous pouvez donc simplement appuyer sur (pour basculer en affichant plus que les noms de fichiers. Je la laisse la plupart du temps (aucun détail affiché), et je l’active brièvement lorsque je veux vérifier certains détails.
attiré

1

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

Il existe des commandes pour rechercher des fichiers ou rechercher des répertoires. Mais pas les deux.

Si vous souhaitez simplement répertorier tous les sous-répertoires et fichiers de manière récursive dans un seul tampon, il existe deux commandes intégrées dans Emacs pour les âges:

  1. M-x find-dired. Cela dépend de l'outil CLI find. Sous Windows, vous devez installer Cygwin ou MYSYS qui afind

  2. M-x find-lisp-find-dired. Identique à find-diredmais écrit en Lisp. Il n'y a donc pas de dépendance de tiers. En outre, il peut reconnaître les paramètres régionaux hors de la boîte. Mais c'est plus lent quefind-dired


Mon cas d'utilisation serait le même que celui qui utilise la commande shell UNIX lsou la fonction Emacs find-file, qui répertorient à la fois les fichiers et les répertoires, y compris les répertoires vides.
Evan Aad

Sont find-dired- ils et find-lisp-find-diredrécursifs en ce qu'ils listent non seulement le contenu du répertoire courant, mais aussi le contenu de chacun de ses sous-répertoires, sous-sous-répertoires, etc.?
Evan Aad

Oui, récursivement
Chen Bin

1

Cette réponse suppose que vous souhaitez obtenir une liste Lisp des noms de fichiers et de répertoires, au lieu d'en afficher la liste.

Si vous utilisez la bibliothèque Dired +, vous pouvez utiliser la fonction diredp-files-within. (Vous n'avez pas besoin d'être dans un tampon Dired pour l'utiliser.)

Cela fonctionne avec n'importe quelle version d'Emacs, et c'est plus général que directory-files-recursively.

  • Vous pouvez lui passer une liste de fichiers et de répertoires, et il agit récursivement dans chacun d'eux.

  • Ou vous pouvez lui passer une fonction qui renvoie une telle liste.

    • S'il existe un tampon Dired pour un répertoire qui est traité, la fonction est invoquée dans ce tampon pour renvoyer la liste des fichiers à inclure.

      Par exemple, si la fonction est dired-get-marked-files alors, seuls les fichiers et sous-répertoires marqués sont inclus.

  • Vous pouvez lui passer un prédicat que chaque fichier ou répertoire doit satisfaire. La correspondance d'expression régulière est bien sûr un type de prédicat.

  • Vous pouvez lui dire de ne pas suivre les liens symboliques.


0
(defun my-dir-list (source)
  ;;
  ;; Imprimer les fichiers de liste dans le tampon actuel
  ;;
  ;; Non testé, type de système: gnu
  ;; Testé, type de système: windows-nt
  ;;
  ("sDirectory:" interactif)
  (soit ((n 0)
    (l-file-dir (and (cd source) (directory-files-and-attributes "./"))))
    (liste-dir '())
    (liste de fichiers '())
    )
    (princ (format "% s \ n" répertoire-par défaut) (tampon-actuel))
    (tandis que l-file-dir
      (if (nth 1 (car l-file-dir))
      (setq n (1+ n)
        dir-list (cons ((lambda (source)
                  (et (pas (string-prefix-p "." (car source))) source))
                (car l-file-dir)) dir-list)
        )
    (princ (format "% s \ n" (concat default-directory
                      (et (correspondance de chaîne "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-file-dir)))) (current-buffer))
    )
      (setq l-file-dir (cdr l-file-dir))
      )
    (while (caar dir-list)
      (setq dir-list (cdr dir-list))
      (cd "..")
      )
    )
  'D'accord
  )
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.