Daftar semua file dan sub-direktori secara rekursif

15

Apakah ada cara, mungkin menggunakan paket, untuk secara rekursif mendaftarkan semua file (dengan path) dan sub-direktori (atau setidaknya sub-direktori kosong , karena path ke yang non-kosong dapat diperoleh dari jalur file yang terkandung di dalamnya) dari direktori saat ini?

Yang paling dekat yang bisa saya temukan adalah projectile-find-filefungsi dari projectilepaket (sebagai alternatif, helm-projectile-find-filefungsi dari helm-projectilepaket), tetapi sepertinya tidak dapat membuat daftar folder kosong. Selain itu, tampaknya hanya berfungsi dengan Git dan repositori kontrol versi lain, tetapi mungkin ada solusi untuk batasan ini.

Evan Aad
sumber
2
Saya tidak yakin apa yang Anda coba lakukan, tetapi [posting blog ini] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) mungkin berisi apa yang Anda butuhkan, atau Anda dapat mencoba [yang ini] (ergoemacs.org/emacs/elisp_traverse_dir.html) sebagai starter.
theldoria
Apa yang Anda maksud dengan "daftar"? Apakah Anda menginginkan fungsi Emacs Lisp yang mengembalikan daftar string dengan path? Apakah Anda ingin buffer dengan jalur di dalamnya, katakanlah, satu per baris? Apakah Anda ingin buffer dired dengan semua file? (Yang terakhir itu mudah, tambahkan "-R" ke switch ls dired.)
Omar
@ Umar: Saya harus persyaratan ideal: (1) bahwa itu akan menjadi bagian dari Emacs atau bagian dari paket, (2) bahwa itu akan bekerja dengan salah satu helmatau ivy, yaitu bahwa hasilnya akan ditampilkan di dalam helmatau ivybuffer. Jika tidak mungkin untuk memenuhi kedua persyaratan, yang ke-2 lebih penting bagi saya.
Evan Aad
1
Itu benar-benar dua pertanyaan yang berbeda. Tapi oke, saya memberikan jawaban untuk masing-masing.
Drew

Jawaban:

8

Dengan asumsi Anda menggunakan ivyAnda dapat menggunakan fungsi ini

    (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
sumber
Terima kasih. Bagaimana jika saya menggunakan helm?
Evan Aad
1
Maaf, saya tidak tahu helm. ivycukup ringan. Cobalah.
fhdhsni
13

direktori-file-secara rekursif

(Saya pikir ini ditambahkan dalam Emacs 25)

inilah tautan ke manual: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Kembalikan semua file di bawah direktori yang namanya cocok dengan regexp. Fungsi ini mencari direktori yang ditentukan dan sub-direktori, secara rekursif, untuk file yang nama dasarnya (yaitu, tanpa direktori terkemuka) cocok dengan regexp yang ditentukan, dan mengembalikan daftar nama file absolut dari file yang cocok (lihat nama file absolut) . Nama file dikembalikan dalam urutan pertama, artinya file dalam beberapa sub direktori dikembalikan sebelum file dalam direktori induknya. Selain itu, file-file yang cocok yang ditemukan di setiap subdirektori diurutkan secara alfabet berdasarkan nama dasarnya. Secara default, direktori yang namanya cocok dengan regexp dihilangkan dari daftar, tetapi jika argumen opsional termasuk-direktori adalah nihil, mereka dimasukkan.

Contoh

(directory-files-recursively default-directory "")
wvxvw
sumber
Tidak menemukan direktori kosong
fhdhsni
1
@fhdhsni apakah Anda mencoba pengaturan include-directorieske t? Saya sedang bekerja di Emacs 24, dan tidak dapat mencoba ini sekarang, tetapi saya dapat menguji ini di rumah dalam beberapa jam.
wvxvw
Salahku. Saya tidak melakukan itu. Anda mungkin ingin memasukkannya dalam jawaban Anda.
fhdhsni
4

Jawaban ini mengasumsikan bahwa Anda ingin menampilkan daftar file dan nama dir, alih-alih mendapatkan daftar Lisp dari mereka.

Gunakan standar Emacs perintah find-dired, find-name-diredatau find-grep-dired. File dan nama dir yang ditemukan ditampilkan dalam buffer mode Dired. (Anda dapat menggunakan semua kekuatan Dired untuk mengerjakan hasilnya.)

Jika Anda menggunakan pustaka find-dired+.elmaka Anda memiliki versi yang disempurnakan dari perintah standar Emacs itu, lebih baik Anda memiliki perintah find-time-dired, yang menemukan file yang lebih baru atau lebih tua dari cap waktu yang diberikan.

Drew
sumber
find-diredpersis apa yang saya cari, tetapi apakah ada cara untuk mencetak hanya nama? Karena kalau tidak satu nama file mengambil banyak baris tanpa alasan karena saya sama sekali tidak peduli dengan ukuran, tanggal, atau izin file. Saya sudah mencoba menjalankan (setcar find-ls-option "-printf '%p\n'")sebelumnya find-dired, tetapi untuk beberapa alasan cara ini dired tidak ingin membuka file setelah menekan Enter pada item.
Hi-Angel
2
@ Hi-Angel: Buffer tempat hasilnya ditampilkan dalam mode Dired. Jadi Anda bisa menekan (untuk beralih menampilkan lebih dari nama file on / off. Saya mematikannya sebagian besar waktu (tidak ada detail yang ditampilkan), dan hanya mengaktifkannya sebentar ketika saya ingin memeriksa beberapa detail.
Drew
1

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

Ada perintah untuk mencari file atau mencari direktori. Tapi tidak keduanya.

Jika Anda hanya ingin membuat daftar semua sub-direktori dan file secara rekursif dalam satu buffer, ada dua perintah yang dibangun di Emacs untuk usia:

  1. M-x find-dired. Itu tergantung pada alat CLI find. Di Windows, Anda perlu menginstal Cygwin atau MYSYS yang telahfind

  2. M-x find-lisp-find-dired. Sama seperti find-diredtetapi ditulis dalam Lisp. Jadi tidak ada ketergantungan pihak ketiga. Selain itu, dapat mengenali lokal di luar kotak. Tapi lebih lambat dari itufind-dired

chen bin
sumber
Kasing penggunaan saya akan sama dengan siapa pun yang menggunakan perintah shell UNIX ls, atau fungsi Emacs find-file, yang keduanya mencantumkan file dan direktori, termasuk direktori kosong.
Evan Aad
Apakah find-direddan bersifat find-lisp-find-diredrekursif karena mereka mencantumkan tidak hanya isi direktori saat ini, tetapi juga isi dari masing-masing sub-direktori, sub-sub-direktori, dll?
Evan Aad
Ya, secara rekursif
chen bin
1

Jawaban ini mengasumsikan bahwa Anda ingin mendapatkan daftar file Lisp dan nama dir, alih-alih menampilkan daftar mereka.

Jika Anda menggunakan library Dired + maka Anda dapat menggunakan fungsi diredp-files-within. (Anda tidak perlu berada dalam buffer Dired untuk menggunakannya.)

Ini berfungsi dengan versi Emacs apa pun, dan ini lebih umum daripada directory-files-recursively.

  • Anda dapat memberikan daftar file dan direktori, dan itu bertindak secara rekursif di masing-masing.

  • Atau Anda dapat melewatinya fungsi yang mengembalikan daftar tersebut.

    • Jika ada buffer Dired untuk direktori yang diproses maka fungsi dipanggil dalam buffer itu untuk mengembalikan daftar file yang akan disertakan.

      Misalnya, jika fungsinya dired-get-marked-files maka hanya file dan subdirektori yang ditandai yang disertakan.

  • Anda dapat memberikannya predikat yang harus dipenuhi oleh setiap file atau direktori. Pencocokan Regexp tentu saja merupakan salah satu jenis predikat.

  • Anda dapat mengatakan itu untuk tidak mengikuti tautan simbolik.

Drew
sumber
0
(menolak daftar-dir-saya (sumber)
  ;;
  ;; Cetak daftar file dalam buffer saat ini
  ;;
  ;; Tidak diuji, tipe sistem: gnu
  ;; Diuji, tipe sistem: windows-nt
  ;;
  (interaktif "sDirectory:")
  (biarkan ((n 0))
    (l-file-dir (dan (sumber cd) (direktori-file-dan-atribut "./")))
    (daftar-dir '())
    (daftar file '())
    )
    (princ (format "% s \ n" direktori default) (buffer saat ini))
    (sementara l-file-dir
      (if (nth 1 (car l-file-dir))
      (setq n (1+ n)
        daftar dir (kontra ((lambda (sumber))
                  (dan (bukan (string-awalan-p "." (sumber mobil))) sumber))
                (car l-file-dir)) dir-list)
        )
    (princ (format "% s \ n" (direktori default concat
                      (dan (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 daftar-dir (daftar-cdr daftar))
      (cd "..")
      )
    )
  'baik
  )
joe
sumber