递归列出所有文件和子目录


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)可能包含您所需的内容,或者您可以尝试[this one](ergoemacs.org/emacs/elisp_traverse_dir.html)作为入门。
theldoria

“列表”是什么意思?您是否需要Emacs Lisp函数来返回带有路径的字符串列表?您是否想要一个带有路径的缓冲区,例如每行一个?您是否想要一个包含所有文件的缓冲区?(那最后一个很简单,将“ -R”添加到ls开关中,然后变暗。)
Omar


@Omar:我有一个理想的要求:(1)它应该是Emacs的一部分,还是包的一部分,(2)它可以与helmor 一起使用ivy,即结果将显示在helmor ivy缓冲区中。如果无法同时满足这两个要求,那么第二个对我来说更重要。
伊万·阿德

1
这实际上是两个不同的问题。但是,好的,我为每个人都提供了答案。
德鲁

Answers:


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
抱歉,我不知道helmivy非常轻巧。给它开枪。
fhdhsni

13

递归目录文件

(我认为这是在Emacs 25中添加的)

这是手册的链接:https : //www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

返回名称与regexp匹配的目录下的所有文件。此函数以递归方式在指定目录及其子目录中搜索其基名(即,没有前导目录)与指定正则表达式匹配的文件,并返回匹配文件的绝对文件名列表(请参阅绝对文件名) 。文件名按深度优先顺序返回,这意味着某些子目录中的文件先于其父目录中的文件返回。此外,在每个子目录中找到的匹配文件均按其基名按字母顺序排序。默认情况下,名称与regexp匹配的目录将从列表中省略,但是如果可选参数include-directories为non-nil,则将其包括在内。

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

它找不到空目录
fhdhsni

1
@fhdhsni您尝试设置include-directoriest吗?我正在使用Emacs 24,目前无法尝试,但是我可以在几个小时内在家进行测试。
wvxvw

我的错。我没那么做 您可能希望将其包括在答案中。
fhdhsni

4

该答案假定您要显示文件名和目录名的列表,而不是获取它们的Lisp列表。

使用标准的Emacs命令find-diredfind-name-diredfind-grep-dired。找到的文件和目录名称显示在Dired模式缓冲区中。(您可以将Dired的全部功能用于处理结果。)

如果您使用库,find-dired+.el那么您将拥有这些标准Emacs命令的增强版本,而长毛绒则拥有一个command find-time-dired,该命令可以查找比给定时间戳更新或更旧的文件。


find-dired正是我要寻找的东西,但是有没有办法只打印姓名?因为否则,单个文件名会无故占用多行,因为我绝对不在乎文件的大小,日期或权限。我已经尝试过在(setcar find-ls-option "-printf '%p\n'")之前运行find-dired,但是由于某种原因,这种方法导致不想在按Enter键时打开文件。
Hi-Angel

2
@ Hi-Angel:显示结果的缓冲区处于Dired模式。因此,您只需按一下(即可切换显示,而不是打开/关闭文件名。我通常将其保留为关闭状态(不显示任何详细信息),并且在需要检查一些详细信息时将其短暂打开。
德鲁

1

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

有用于查找文件或查找目录的命令。但不是两者。

如果只想在一个缓冲区中递归列出所有子目录和文件,那么Emacs中内置了两个命令,适用于很长一段时间:

  1. M-x find-dired。它取决于CLI工具find。在Windows上,您需要安装Cygwin或MYSYSfind

  2. M-x find-lisp-find-dired。与find-diredLisp语言相同。因此,没有第三方依赖性。此外,它可以立即识别区域设置。但这比find-dired


我的用例将与使用UNIX shell命令ls或Emacs函数的任何人相同find-file,这两个命令都列出文件和目录,包括空目录。
伊万·阿德

find-diredfind-lisp-find-dired递归的,因为它们不仅列出当前目录的内容,而且还列出其每个子目录,子子目录等的内容?
伊万·阿德

是的,递归
陈斌

1

该答案假定您要获取文件名和目录名的Lisp列表,而不是显示它们的列表。

如果使用Dired +库,则可以使用function 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文件目录(和(cd源)(目录文件和属性“ ./”)))
    (目录列表'())
    (文件列表'())
    )
    (princ(格式为“%s \ n”默认目录)(当前缓冲区))
    (而l-file-dir
      (如果(nth 1(car l-file-dir))
      (setq n(1+ n)
        目录列表(cons((lambda(source)
                  (和(不是(string-prefix -p“。”(汽车来源)))源))
                (汽车l-file-dir))目录列表)
        )
    (princ(格式为“%s \ n”(concat默认目录
                      (和(字符串匹配“ \\。[0-9 | Az]”(caar l-file-dir))
                       (caar l-file-dir))))(当前缓冲区))
    )
      (setq l-file-dir(cdr l-file-dir))
      )
    (同时(caar目录列表)
      (setq目录列表(cdr目录列表))
      (cd“ ..”)
      )
    )
  '好
  )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.