Рекурсивный список всех файлов и подкаталогов


15

Есть ли способ, возможно, с помощью пакета, чтобы рекурсивно перечислить все файлы (с путями) и подкаталоги (или, по крайней мере, пустые подкаталоги, так как пути к непустым можно почерпнуть из путей файлы, содержащиеся в нем) текущего каталога?

Самое близкое, что я мог найти, - это projectile-find-fileфункция projectileпакета (или helm-projectile-find-fileфункция helm-projectileпакета), но, похоже, он не в состоянии перечислить пустые папки. Кроме того, кажется, что он работает только с Git и другими репозиториями контроля версий, но для этого ограничения может быть обходной путь.


2
Я не совсем уверен в том, что вы пытаетесь сделать, но [этот пост в блоге] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) может содержать то, что вам нужно, или вы можете попробовать [этот] (ergoemacs.org/emacs/elisp_traverse_dir.html) в качестве стартового.
Телдория

Что вы подразумеваете под «списком»? Вам нужны функции Emacs Lisp, которые возвращают список строк с путями? Вы хотите буфер с путями в нем, скажем, по одному на строку? Вам нужен буфер со всеми файлами? (Это последнее легко, добавьте "-R" к переключателям ls в dired.)
Омар


@ Омар: я должен к идеальным требованиям: (1) что он будет либо частью Emacs, либо частью пакета, (2) он будет работать либо с либо, helmлибо ivy, т.е. результаты будут отображаться в буфере helmили ivy. Если невозможно удовлетворить оба требования, для меня важнее второе.
Эван Аад

1
Это действительно два разных вопроса. Но хорошо, я дал ответ для каждого.
Дрю

Ответы:


8

Предполагая, что вы используете, ivyвы можете использовать эту функцию

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

Благодарю. Что делать, если я использую helm?
Эван Аад

1
Извините, я не знаю о helm. ivyдовольно легкий. Дайте это выстрел.
fhdhsni

13

Каталог-файлы рекурсивно

(Я думаю, что это было добавлено в Emacs 25)

вот ссылка на руководство: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Вернуть все файлы в каталоге, имена которых соответствуют регулярному выражению. Эта функция рекурсивно ищет в указанном каталоге и его подкаталогах файлы, базовые имена которых (т.е. без ведущих каталогов) соответствуют указанному регулярному выражению, и возвращает список абсолютных имен файлов соответствующих файлов (см. Абсолютные имена файлов) , Имена файлов возвращаются в порядке глубины, что означает, что файлы в некотором подкаталоге возвращаются перед файлами в его родительском каталоге. Кроме того, соответствующие файлы, найденные в каждом подкаталоге, сортируются в алфавитном порядке по их базовым именам. По умолчанию каталоги, чьи имена соответствуют регулярному выражению, в списке опущены, но если необязательный аргумент include-directoryies не равен nil, они включаются.

пример

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

Он не находит пустых каталогов
fhdhsni

1
@fhdhsni пытались ли вы настройки include-directoriesв t? Я нахожусь на Emacs 24 и не могу попробовать это прямо сейчас, но я могу проверить это дома через несколько часов.
wvxvw

Виноват. Я этого не делал. Вы можете включить его в свой ответ.
fhdhsni

4

Этот ответ предполагает, что вы хотите отобразить список имен файлов и каталогов вместо получения списка их в Лиспе.

Используйте стандартный Emacs команды find-dired, find-name-diredили find-grep-dired. Найденные имена файлов и папок отображаются в буфере режима Dired. (Вы можете использовать всю мощь Dired для работы над результатами.)

Если вы используете библиотеку, find-dired+.elто у вас есть расширенные версии этих стандартных команд Emacs, плюс у вас есть команда find-time-dired, которая находит файлы, которые новее или старше заданной отметки времени.


find-diredэто именно то, что я ищу, но есть ли способ печатать только имена? Потому что в противном случае одно имя файла занимает несколько строк без причины, так как мне абсолютно безразлично размер, дата или права доступа к файлам. Я пытался запустить (setcar find-ls-option "-printf '%p\n'")до find-dired, но по какой-то причине этот путь устарел, не хотят открывать файл после нажатия Enter поверх элемента.
Привет, Ангел,

2
@ Hi-Angel: буфер, в котором отображаются результаты, находится в режиме Dired. Таким образом, вы можете просто нажать, (чтобы включить / выключить отображение не только имен файлов. Я отключаю его большую часть времени (подробности не отображаются) и просто кратко включаю его, когда хочу проверить некоторые детали.
Дрю

1

См. Https://github.com/technomancy/find-file-in-project.

Есть команды, чтобы найти файл или найти каталоги. Но не оба.

Если вы просто хотите перечислить все подкаталоги и файлы рекурсивно в одном буфере, есть две команды, встроенные в Emacs целую вечность:

  1. M-x find-dired, Это зависит от инструмента CLI find. В Windows вам нужно установить Cygwin или MYSYS, который имеетfind

  2. M-x find-lisp-find-dired, То же, что и find-diredнаписано на Лиспе. Таким образом, нет никакой зависимости от третьей стороны. Кроме того, он может распознать локаль из коробки. Но это медленнее, чемfind-dired


Мой вариант использования будет таким же, как и у любого, кто использует команду оболочки UNIX lsили функцию Emacs find-file, в обоих из которых перечислены как файлы, так и каталоги, включая пустые каталоги.
Эван Аад

Существуют find-diredи find-lisp-find-diredрекурсивных в том , что они перечисляют не только содержимое текущего каталога, но и содержание каждого из его подкаталогов, суб-суб-каталогов, и т.д.?
Эван Аад

Да, рекурсивно
Чен Бин

1

В этом ответе предполагается, что вы хотите получить список Lisp для имен файлов и dir, а не отображать их список.

Если вы используете библиотеку Dired +, тогда вы можете использовать функцию diredp-files-within. (Вам не нужно быть в буфере Dired, чтобы использовать его.)

Это работает с любой версией Emacs и является более общим, чем directory-files-recursively.

  • Вы можете передать ему список файлов и директорий, и он действует рекурсивно в каждом из них.

  • Или вы можете передать ему функцию, которая возвращает такой список.

    • Если для каталога, который обрабатывается, существует буфер Dired , то в этом буфере вызывается функция, возвращающая список включаемых файлов.

      Например, если функция включена, включаются dired-get-marked-files только отмеченные файлы и подкаталоги.

  • Вы можете передать ему предикат, который должен удовлетворять каждый файл или каталог. Соответствие регулярному выражению, конечно, является одним из видов предикатов.

  • Вы можете сказать, что не следует переходить по символическим ссылкам.


0
(defun my-dir-list (источник)
  ;;
  ;; Печать списка файлов в текущем буфере
  ;;
  ;; Не проверено, тип системы: GNU
  ;; Протестировано, системный тип: windows-nt
  ;;
  (интерактивное "sDirectory:")
  (пусть ((n 0)
    (l-file-dir (и (cd source) (directory-files-and-attribute "./")))
    (dir-list '())
    (file-list '())
    )
    (princ (формат "% s \ n" default-directory) (текущий буфер))
    (пока l-file-dir
      (если (nth 1 (car l-file-dir))
      (setq n (1+ n)
        dir-list (cons ((лямбда-источник)
                  (и (нет (string-prefix-p "." (источник кода))) source))
                (car l-file-dir)) dir-list)
        )
    (princ (формат "% s \ n" (concat default-directory
                      (и (строковое совпадение "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-file-dir)))) (текущий буфер))
    )
      (setq l-file-dir (cdr l-file-dir))
      )
    (while (caar dir-list)
      (setq dir-list (cdr dir-list))
      (компакт диск "..")
      )
    )
  'Ok
  )
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.