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


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) в якості стартера.
theldoria

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


@Omar: Я маю ідеальні вимоги: (1), що це буде або частина Emacs, або частина пакету, (2), що вона буде працювати з або, helmабо ivy, тобто результати будуть відображатися в helmабо ivyбуфері. Якщо неможливо задовольнити обидві вимоги, для мене важливіше 2-е.
Еван Аад

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

Повернути всі файли в каталозі, імена яких відповідають regexp. Ця функція здійснює пошук у вказаному каталозі та його підкаталогах, рекурсивно, для файлів, базові імена яких (тобто без провідних каталогів) відповідають вказаному регулярному виводу і повертає список абсолютних імен файлів відповідних файлів (див. Абсолютні назви файлів) . Імена файлів повертаються в першому порядку, тобто файли в деяких підкаталогах повертаються перед файлами в його батьківському каталозі. Крім того, відповідні файли, знайдені у кожному підкаталозі, сортуються в алфавітному порядку за їх базовими іменами. За замовчуванням каталоги, імена яких відповідають reggexp, опущені зі списку, але якщо необов'язковий аргумент include-каталогі не є нульовим, вони включаються.

Приклад

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

Тут не знайдено порожніх каталогів
fhdhsni

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

Моє ліжко. Я цього не робив. Ви можете включити його у свою відповідь.
fhdhsni

4

Ця відповідь передбачає, що ви хочете відобразити перелік імен файлів та dir, замість того, щоб отримувати їх список Lisp.

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

Якщо ви користуєтеся бібліотекою, find-dired+.elтоді у вас є вдосконалені версії стандартних команд Emacs, плюшевою є команда find-time-dired, в якій знаходять файли, новіші або старіші за задану часову позначку.


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

2
@ Привіт-Ангел: Буфер, в якому відображаються результати, знаходиться в режимі "Оброблений". Таким чином, ви можете просто натиснути, (щоб увімкнути / вимкнути показ більше, ніж імена файлів. Більшу частину часу я залишаю його (жодних деталей не показано) і просто коротко вмикаю його, коли хочу перевірити деякі деталі.
Дрю

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. (Щоб використовувати його, вам не потрібно знаходитись у подвійному буфері.)

Це працює з будь-якою версією Emacs, і вона більш загальна, ніж directory-files-recursively.

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

  • Або ви можете передати йому функцію, яка повертає такий список.

    • Якщо для каталогу, який обробляється, існує подвійний буфер, функція викликається в цьому буфері для повернення списку файлів, які слід включити.

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

  • Ви можете передати йому присудок, якому повинен відповідати кожен файл або каталог. Збіг Regexp - це, звичайно, один вид предиката.

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


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