如何在目录中递归查找文件

时间:2013-09-26 23:08:27

标签: emacs

通常,我知道文件名但不记得或者发现指定确切的目录很麻烦。我希望能够找到文件x / y / * / some_file.txt,其中*允许在递归目录中搜索,而不仅仅是当前目录。

9 个答案:

答案 0 :(得分:22)

如上所述here

M-x find-name-dired

提供目录和模式后,匹配的文件将显示在Dired缓冲区中。您可以导航文件列表(C-nC-p等)并根据需要打开文件(Ret)。

答案 1 :(得分:7)

我一直在寻找这个功能,现在我对我发现的内容感到满意:我正在使用helm-projectile

Projectile是一个项目交互库。项目是包含.projectile文件的VCS目录或目录。它基于GNU find(但也提供纯emacs lisp实现)

https://github.com/bbatsov/projectile

(您可以使用packages.el安装它)。您可以单独使用它:致电projectile-find-file(或projectile-mode和C-c p f)。默认情况下,它使用ido完成,但在这种情况下,我更喜欢helm-projectile的接口。

由于该功能,我的同事一直告诉我使用Sublime Text。幸运的是,我发现了抛射物:)

答案 2 :(得分:6)

ido-find-file执行此操作:当您输入的文件名不匹配时 当前目录中的任何内容,都使用locate之类的匹配项 你对你系统上的所有文件写的内容。

设置只有一行:

(ido-mode)

此后, C-x C-f 将呼叫ido-find-file。 另外,我通常会添加:

(setq ido-enable-flex-matching t)

因为我喜欢它,但有了它,你会locate更多的结果, 即foo也将匹配froo

答案 3 :(得分:4)

如果是项目目录中的文件,我使用了同一作者使用模糊搜索库的Fiplr

https://github.com/d11wtq/fiplr

这可以从MELPA获得。

我没有尝试的其他解决方案是https://github.com/technomancy/find-file-in-project

答案 4 :(得分:2)

修改:我发现projectile效果更好,请参阅我的其他答案。

有find-recursive.el:http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt

下载它,把它放在你的加载路径中并在你的.emacs中要求它:(它不能通过ELPA或el-get获得)

(require 'find-recursive)      

现在当你调用M-x find-recursive时,它会要求一个文件名来递归搜索一个基本目录,然后你必须在结果列表中选择一个文件。遗憾的是,它没有被整合到ido中,但我喜欢它,它有时很有用。

答案 5 :(得分:2)

这是一个解决方案,它为您搜索的文件和子目录提供选择性。要使用它,您需要Dired+Icicles

仅在Dired中使用的命令是icicle-visit-marked-file-of-content-recursive(或其-other-window版本)。它绑定到M-+ C-F(对于其他窗口,请使用M-+ C-O - 是的,这些是大写FO)。

它的作用:

  • 作为完成的候选者,它提供了当前Dired目录中标记的所有文件,pslus所有标记的子目录中的所有文件都有Dired缓冲区,等等递归。

  • 您可以访问任何与您的迷你缓冲输入匹配的候选人,包括所有这些候选人。您可以访问一些与迷你缓冲区输入模式匹配的模式,然后更改模式以匹配并访问其他模式 - 所有这些都在相同的命令调用中。

  • "Matching" your input can mean either or both

    • 匹配文件 名称
    • 匹配文件 内容

    也就是说,您的输入可以是两部分(通过点击C-M-j分隔:文件名部分和文件内容部分。通过匹配文件名缩小选项,并通过匹配文本进一步缩小这些文件。这种搜索速度很快 - 只要在文件中找到一个匹配就会成功。

    您可以省略任一部分:仅匹配文件名(快速)或仅匹配文件内容(较慢,自然)。

  • 您可以组合输入模式 - progressive completion。添加其他模式以便以增量和交互方式进行匹配要比尝试提供一个能够满足您需求的单一正则表达式要容易得多。

  • 每个输入模式(两部分模式的每个部分)都可以是正则表达式。也可以使用模糊匹配。

  • 您也可以在Dired缓冲区中插入子目录,而不是将它们作为单独的Dired缓冲区。在Dired缓冲区中标记的任何文件和子目录都以相同的方式处理。

    如果您不想下降到已标记的子目录,您可以使用命令的非递归版本icicle-visit-marked-file-of-content,绑定到C-FC-O用于其他 - 窗口)。

如果您还使用Bookmark+,则可以为Dired缓冲区或一组Dired缓冲区添加书签。书签记录了哪些文件和子目录被标记,插入了哪些子目录,以及省略了哪些文件和子目录。跳转到这样的书签可以恢复所有这些内容。这为您提供了一种快照项目的方法,然后您可以使用M-+ C-F等进行搜索。

答案 6 :(得分:2)

列出了很多选项,我使用下一个命令:

find-file-in-current-directory

你可以把它放在你的.emacs中:

;; Find file in current directory:
(global-set-key (kbd "C-M-,") 'find-file-in-current-directory)

界面对于使用fsf工具(https://github.com/junegunn/fzf

的人来说非常熟悉

答案 7 :(得分:1)

如果您有掌舵,可以使用此:

(defun my/helm-find-file-recursively ()
   "Recursively find files in glob manner, in the specified directory."
   (interactive)
   (helm-find 'ask-for-dir))

(global-set-key (kbd "C-c o f") 'my/helm-find-file-recursively)

答案 8 :(得分:0)

Icicles命令icicle-locate(如果您的操作系统没有icicle-locate-file程序,则为locate)。 Locate a file anywhere under a given directory(包括~HOME或根目录)。

您可以匹配绝对文件名的任何部分(即路径和文件名)。您可以使用多种匹配,包括正则表达式,子字符串和模糊匹配。