Liệt kê danh sách tất cả các tập tin và thư mục con


15

Có cách nào, có thể sử dụng một gói, để liệt kê đệ quy tất cả các tệp (có đường dẫn) và thư mục con (hoặc ít nhất là các thư mục con trống , vì các đường dẫn đến các tệp không trống có thể được lượm lặt từ các đường dẫn của các tập tin chứa trong đó) của thư mục hiện tại?

Gần nhất tôi có thể tìm thấy là projectile-find-filechức năng của projectilegói (cách khác, helm-projectile-find-filechức năng của helm-projectilegói), nhưng dường như không thể liệt kê các thư mục trống. Ngoài ra, nó dường như chỉ hoạt động với Git và các kho điều khiển phiên bản khác, nhưng có thể có một cách giải quyết cho giới hạn này.


2
Tôi không hoàn toàn chắc chắn những gì bạn cố gắng làm, nhưng [bài đăng trên blog này] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) có thể chứa những gì bạn cần, hoặc bạn có thể thử [cái này] (ergoemacs.org/emacs/elisp_traverse_dir.html) làm món khai vị.
theldoria

"Danh sách" nghĩa là gì? Bạn có muốn một hàm Lisp Emacs trả về danh sách các chuỗi có đường dẫn không? Bạn có muốn một bộ đệm với các đường dẫn trong đó, giả sử, một đường dẫn trên mỗi dòng không? Bạn có muốn một bộ đệm dired với tất cả các tập tin? (Cái cuối cùng thật dễ dàng, thêm "-R" vào các công tắc ls trong thư mục.)
Omar


@Omar: Tôi phải có các yêu cầu lý tưởng: (1) rằng nó sẽ là một phần của Emacs hoặc một phần của gói, (2) nó sẽ hoạt động với một trong hai helm, hoặc ivykết quả sẽ được hiển thị trong một helmhoặc ivybộ đệm. Nếu không thể đáp ứng cả hai yêu cầu, thì thứ 2 quan trọng hơn đối với tôi.
Evan Aad

1
Đó thực sự là hai câu hỏi khác nhau. Nhưng OK, tôi đã cung cấp một câu trả lời cho mỗi.
Drew

Câu trả lời:


8

Giả sử bạn sử dụng ivybạn có thể sử dụng chức năng này

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

Cảm ơn. Nếu tôi sử dụng helmthì sao?
Evan Aad

1
Xin lỗi, tôi không biết về helm. ivylà khá nhẹ. Cho nó bắn.
fhdhsni

13

thư mục-tập tin-đệ quy

(Tôi nghĩ rằng điều này đã được thêm vào trong Emacs 25)

đây là liên kết đến hướng dẫn sử dụng: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Trả về tất cả các tệp trong thư mục có tên trùng khớp. Hàm này tìm kiếm thư mục được chỉ định và các thư mục con của nó, theo cách đệ quy, cho các tệp có tên cơ sở (nghĩa là không có thư mục hàng đầu) khớp với biểu thức chính quy định và trả về danh sách tên tệp tuyệt đối của các tệp phù hợp (xem tên tệp tuyệt đối) . Tên tệp được trả về theo thứ tự độ sâu, nghĩa là các tệp trong một số thư mục con được trả về trước các tệp trong thư mục mẹ của nó. Ngoài ra, các tệp phù hợp được tìm thấy trong mỗi thư mục con được sắp xếp theo thứ tự abc theo tên cơ sở của chúng. Theo mặc định, các thư mục có tên khớp với biểu thức chính được bỏ qua khỏi danh sách, nhưng nếu đối số tùy chọn bao gồm các thư mục không phải là số không, chúng sẽ được bao gồm.

Thí dụ

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

Nó không tìm thấy các thư mục trống
fhdhsni

1
@fhdhsni bạn đã thử thiết include-directoriesđể t? Tôi đang làm việc trên Emacs 24 và không thể thử điều này ngay bây giờ, nhưng tôi có thể thử nghiệm điều này ở nhà trong vài giờ.
wvxvw

Lỗi của tôi. Tôi đã không làm điều đó. Bạn có thể muốn bao gồm nó trong câu trả lời của bạn.
fhdhsni

4

Câu trả lời này giả định rằng bạn muốn hiển thị danh sách tên tệp và thư mục, thay vì lấy danh sách Lisp của chúng.

Sử dụng tiêu chuẩn Emacs lệnh find-dired, find-name-diredhoặc find-grep-dired. Tên tập tin và thư mục tìm thấy được hiển thị trong bộ đệm chế độ Dired. (Bạn có thể đặt tất cả sức mạnh của Dired để làm việc với kết quả.)

Nếu bạn sử dụng thư viện find-dired+.elthì bạn đã có các phiên bản nâng cao của các lệnh Emacs tiêu chuẩn đó, bạn có một lệnh find-time-diredtìm các tệp mới hơn hoặc cũ hơn dấu thời gian đã cho.


find-diredchính xác là những gì tôi đang tìm kiếm, nhưng có cách nào chỉ in tên không? Bởi vì nếu không, tên tệp đơn lẻ mất nhiều dòng mà không có lý do vì tôi hoàn toàn không quan tâm đến kích thước, ngày tháng hoặc quyền của tệp. Tôi đã thử chạy (setcar find-ls-option "-printf '%p\n'")trước đó find-dired, nhưng vì một số lý do, theo cách này, dired không muốn mở tệp khi nhấn Enter trên một mục.
Hi-Angel

2
@ Hi-Angel: Bộ đệm mà kết quả được hiển thị ở chế độ Dired. Vì vậy, bạn chỉ có thể nhấn (để chuyển đổi hiển thị nhiều hơn tên tệp bật / tắt. Tôi bỏ nó hầu hết thời gian (không có chi tiết nào được hiển thị) và chỉ bật tắt nó một cách nhanh chóng khi tôi muốn kiểm tra một số chi tiết.
vẽ

1

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

Có các lệnh để tìm tập tin hoặc tìm thư mục. Nhưng không phải cả hai.

Nếu bạn chỉ muốn liệt kê tất cả các thư mục con và tệp đệ quy trong một bộ đệm, có hai lệnh được xây dựng trong Emacs cho các lứa tuổi:

  1. M-x find-dired. Nó phụ thuộc vào công cụ CLI find. Tại Windows, bạn cần cài đặt Cygwin hoặc MYSYS cófind

  2. M-x find-lisp-find-dired. Tương tự như find-dirednhưng được viết bằng Lisp. Vì vậy, không có sự phụ thuộc của bên thứ ba. Bên cạnh đó, nó có thể nhận ra miền địa phương. Nhưng nó chậm hơnfind-dired


Trường hợp sử dụng của tôi sẽ giống như bất kỳ ai sử dụng lệnh shell UNIX lshoặc hàm Emacs find-file, cả hai đều liệt kê cả tệp và thư mục, bao gồm cả các thư mục trống.
Evan Aad

Được find-diredfind-lisp-find-diredđệ quy ở chỗ họ liệt kê không chỉ nội dung của thư mục hiện tại, mà cả nội dung của từng thư mục con, thư mục con, v.v.?
Evan Aad

Vâng, đệ quy
chen bin

1

Câu trả lời này giả định rằng bạn muốn có được danh sách Lisp của tên tệp và thư mục, thay vì hiển thị danh sách của chúng.

Nếu bạn sử dụng thư viện Dired + thì bạn có thể sử dụng chức năng diredp-files-within. (Bạn không cần phải ở trong bộ đệm có hướng để sử dụng nó.)

Điều này hoạt động với bất kỳ phiên bản Emacs, và nó là tổng quát hơn directory-files-recursively.

  • Bạn có thể truyền cho nó một danh sách các tệp và thư mục, và nó hoạt động đệ quy trong mỗi tệp.

  • Hoặc bạn có thể truyền cho nó một hàm trả về một danh sách như vậy.

    • Nếu có bộ đệm Dired cho một thư mục được xử lý thì hàm được gọi trong bộ đệm đó để trả về danh sách các tệp cần bao gồm.

      Ví dụ: nếu chức năng dired-get-marked-files thì chỉ bao gồm các tệp và thư mục con được đánh dấu .

  • Bạn có thể truyền cho nó một vị từ mà mỗi tệp hoặc thư mục phải đáp ứng. Tất nhiên phù hợp với Regapi là một loại vị ngữ.

  • Bạn có thể nói với nó không theo các liên kết tượng trưng.


0
(defun my-dir-list (nguồn)
  ;;
  ;; In tập tin danh sách trong bộ đệm hiện tại
  ;;
  ;; Chưa được thử nghiệm, loại hệ thống: gnu
  ;; Đã kiểm tra, loại hệ thống: windows-nt
  ;;
  (tương tác "sDirectory:")
  (hãy ((n 0)
    (l-file-dir (và (nguồn cd) (thư mục tệp và thuộc tính "./")))
    (danh sách thư mục '())
    (danh sách tệp '())
    )
    (Prince (định dạng "% s \ n" thư mục mặc định) (bộ đệm hiện tại))
    (trong khi l-file-dir
      (if (nth 1 (xe l-file-dir))
      (setq n (1+ n)
        danh sách dir (khuyết điểm ((lambda (nguồn)
                  (và (không phải (chuỗi-tiền tố-p "." (nguồn xe))) nguồn))
                (xe l-file-dir)) dir-list)
        )
    (Prince (định dạng "% s \ n" (thư mục mặc định concat
                      (và (khớp chuỗi "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-file-dir)))) (bộ đệm hiện tại))
    )
      (setq l-file-dir (cdr l-file-dir))
      )
    (trong khi (danh sách caar)
      (setq dir-list (danh sách cdr)
      (cd "..")
      )
    )
  'đồng ý
  )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.