Enumere recursivamente todos los archivos y subdirectorios

15

¿Hay alguna manera, posiblemente usando un paquete, para enumerar recursivamente todos los archivos (con rutas) y subdirectorios (o al menos los subdirectorios vacíos , ya que las rutas a los no vacíos se pueden extraer de las rutas de los archivos que contiene) del directorio actual?

Lo más cercano que pude encontrar es la projectile-find-filefunción del projectilepaquete (alternativamente, la helm-projectile-find-filefunción del helm-projectilepaquete), pero no parece ser capaz de enumerar carpetas vacías. Además, parece funcionar solo con Git y otros repositorios de control de versiones, pero puede haber una solución para esta limitación.

Evan Aad
fuente
2
No estoy muy seguro de lo que intenta hacer, pero [esta publicación de blog] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) puede contener lo que necesita, o puede probar [este] (ergoemacs.org/emacs/elisp_traverse_dir.html) como iniciador.
theldoria
¿Qué quieres decir con "lista"? ¿Desea una función Emacs Lisp que devuelva una lista de cadenas con las rutas? ¿Desea un búfer con las rutas, por ejemplo, una por línea? ¿Quieres un búfer directo con todos los archivos? (Eso último es fácil, agregue "-R" a los interruptores ls en dired.)
Omar
@Omar: Tengo que requisitos ideales: (1) que va a ser o bien parte de Emacs o parte de un paquete, (2) que va a trabajar, ya sea con helmo ivy, es decir, que los resultados se mostrarán en una helmo ivybuffer. Si es imposible satisfacer ambos requisitos, el segundo es más importante para mí.
Evan Aad
1
Eso es realmente dos preguntas diferentes. Pero está bien, proporcioné una respuesta para cada uno.
Dibujó el

Respuestas:

8

Suponiendo que use ivy, puede usar esta función

    (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
fuente
Gracias. ¿Qué pasa si lo uso helm?
Evan Aad
1
Lo siento, no lo sé helm. ivyEs bastante ligero. Dale un tiro.
fhdhsni
13

directorio-archivos-recursivamente

(Creo que esto se agregó en Emacs 25)

Aquí está el enlace al manual: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Devuelve todos los archivos en el directorio cuyos nombres coinciden con regexp. Esta función busca en el directorio especificado y sus subdirectorios, recursivamente, archivos cuyos nombres básicos (es decir, sin los directorios iniciales) coincidan con la expresión regular especificada, y devuelve una lista de los nombres absolutos de los archivos coincidentes (ver nombres absolutos de archivo) . Los nombres de los archivos se devuelven en primer orden en profundidad, lo que significa que los archivos en algún subdirectorio se devuelven antes que los archivos en su directorio principal. Además, los archivos coincidentes encontrados en cada subdirectorio se ordenan alfabéticamente por sus nombres de base. De manera predeterminada, los directorios cuyos nombres coinciden con regexp se omiten de la lista, pero si el argumento opcional include-directorios es no nulo, se incluyen.

Ejemplo

(directory-files-recursively default-directory "")
wvxvw
fuente
No encuentra directorios vacíos
fhdhsni
1
@fhdhsni hicieron intenta establecer include-directoriesa t? Estoy trabajando en Emacs 24, y no puedo probar esto en este momento, pero puedo probar esto en casa en pocas horas.
wvxvw
Culpa mía. Yo no hice eso. Es posible que desee incluirlo en su respuesta.
fhdhsni
4

Esta respuesta supone que desea mostrar una lista de los nombres de archivo y directorio, en lugar de obtener una lista Lisp de ellos.

Utilice los comandos estándar de Emacs find-dired, find-name-diredo find-grep-dired. El archivo encontrado y los nombres de directorio se muestran en un búfer en modo Dired. (Puede poner todo el poder de Dired para trabajar en los resultados).

Si usa la biblioteca, find-dired+.elentonces tiene versiones mejoradas de esos comandos estándar de Emacs, además tiene un comando find-time-dired, que encuentra archivos que son más nuevos o más antiguos que una marca de tiempo dada.

Dibujó
fuente
find-diredes exactamente lo que estoy buscando, pero ¿hay alguna manera de imprimir solo nombres? Porque de lo contrario, el nombre de archivo único toma varias líneas sin ningún motivo, ya que no me importa el tamaño, la fecha o los permisos de los archivos. He intentado ejecutar (setcar find-ls-option "-printf '%p\n'")antes find-dired, pero por alguna razón de esta manera no quiero abrir un archivo al presionar Enter sobre un elemento.
Hola Angel
2
@ Hi-Angel: el búfer en el que se muestran los resultados está en modo Dired. Por lo tanto, puede presionar (para alternar mostrando más que los nombres de archivo de encendido / apagado. La dejo la mayor parte del tiempo (no se muestran detalles), y solo la activo brevemente cuando quiero verificar algunos detalles.
Dibujó
1

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

Hay comandos para buscar archivos o buscar directorios. Pero no ambos.

Si solo desea enumerar todos los subdirectorios y archivos de forma recursiva en un búfer, hay dos comandos integrados en Emacs para edades:

  1. M-x find-dired. Depende de la herramienta CLI find. En Windows, necesita instalar Cygwin o MYSYS que tienefind

  2. M-x find-lisp-find-dired. Igual que find-diredpero escrito en Lisp. Por lo tanto, no hay dependencia de terceros. Además, puede reconocer la configuración regional fuera de la caja. Pero es más lento quefind-dired

Chen Bin
fuente
Mi caso de uso sería el mismo que cualquiera que use el comando de shell UNIX lso la función Emacs find-file, que enumeran archivos y directorios, incluidos los directorios vacíos.
Evan Aad
¿Son find-diredy find-lisp-find-diredrecursivos en el sentido de que enumeran no solo el contenido del directorio actual, sino también el contenido de cada uno de sus subdirectorios, subdirectorios, etc.?
Evan Aad
Sí, recursivamente
chen bin
1

Esta respuesta supone que desea obtener una lista Lisp de los nombres de archivo y directorio, en lugar de mostrar una lista de ellos.

Si usa la biblioteca Dired + , puede usar la función diredp-files-within. (No necesita estar en un búfer Dired para usarlo).

Esto funciona con cualquier versión de Emacs, y es más general que directory-files-recursively.

  • Puede pasarle una lista de archivos y directorios, y actúa de forma recursiva en cada uno de ellos.

  • O puede pasarle una función que devuelva dicha lista.

    • Si hay un búfer Dired para un directorio que se procesa, la función se invoca en ese búfer para devolver la lista de archivos a incluir.

      Por ejemplo, si la función es dired-get-marked-files solo se incluyen los archivos y subdirectorios marcados .

  • Puede pasarle un predicado que cada archivo o directorio debe satisfacer. La coincidencia de expresiones regulares es, por supuesto, un tipo de predicado.

  • Puedes decirle que no siga enlaces simbólicos.

Dibujó
fuente
0
(defun my-dir-list (fuente)
  ;;
  ;; Imprimir archivos de lista en el búfer actual
  ;;
  ;; No probado, tipo de sistema: gnu
  ;; Probado, tipo de sistema: windows-nt
  ;;
  (interactivo "sDirectory:")
  (let ((n 0)
    (l-file-dir (y (cd source) (directorio-archivos-y-atributos "./")))
    (dir-list '())
    (lista de archivos '())
    )
    (princ (formato "% s \ n" directorio predeterminado) (actual-búfer))
    (mientras que l-file-dir
      (if (nth 1 (car l-file-dir))
      (setq n (1+ n)
        dir-list (cons ((lambda (fuente)
                  (y (no (string-prefix-p "." (fuente del automóvil))) fuente))
                (auto l-file-dir)) dir-list)
        )
    (princ (formato "% s \ n" (directorio predeterminado de concat
                      (y (string-match "\\. [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))
      (discos compactos "..")
      )
    )
  'Okay
  )
joe
fuente