62

在 eclipse 和 textmate 等编辑器/IDE 中,有快捷方式可以快速找到项目目录中的特定文件。

是否有类似的工具可以在 bash 或其他 shell 中对目录中的文件名(递归)进行完整路径完成?

我有很多目录的项目,还有很深的目录(叹气,java)。在 shell 中点击选项卡仅循环通过直接目录中的文件,这还不够 =/

4

8 回答 8

85
find /root/directory/to/search -name 'filename.*'
# Directory is optional (defaults to cwd)

支持标准 UNIX 通配。有关man find更多信息,请参阅。

如果你使用 Vim,你可以使用:

:e **/filename.cpp

或者:tabn任何接受文件名的 Vim 命令。

于 2009-03-18T02:17:18.457 回答
13

如果您希望对文件列表执行某些操作,则可以将 find 与 bash$()构造结合使用(比反引号更好,因为它允许嵌套)。

例如,假设您位于项目目录的顶层,并且您想要一个以“btree”开头的所有 C 文件的列表。命令:

find . -type f -name 'btree*.c'

将返回它们的列表。但这并不能真正帮助与他们做点什么。

因此,让我们进一步假设您要在所有这些文件中搜索字符串“ERROR”或全部编辑它们。您可以执行以下操作之一:

grep ERROR $(find . -type f -name 'btree*.c')
vi $(find . -type f -name 'btree*.c')

去做这个。

于 2009-03-18T03:45:51.083 回答
3

当我在 UNIX 世界中时(使用 tcsh (sigh...)),我曾经设置过各种“查找”别名/脚本来搜索文件。我认为默认的“find”语法有点笨拙,所以我曾经有别名/脚本将“find . -print”通过管道传输到 grep,它允许您使用正则表达式进行搜索:

# finds all .java files starting in current directory
find . -print | grep '\.java'

#finds all .java files whose name contains "Message"
find . -print | grep '.*Message.*\.java'

当然,上面的例子可以用普通的 find 来完成,但是如果你有更具体的搜索,grep 可以帮助很多。这工作得很好,除非“find . -print”有太多的目录需要递归......然后它会变得很慢。(例如,您不希望从根“/”开始执行此操作)

于 2009-03-18T03:41:39.127 回答
3

我使用 ls -R,像这样通过管道传输到 grep:

$ ls -R | grep -i "pattern"

其中 -R 表示递归列出所有文件,-i 表示不区分大小写。最后,模式可能是这样的:“std*.h”或“^io”(文件名中以“io”开头的任何内容)

于 2021-01-14T15:21:12.407 回答
1

我使用这个脚本在项目中跨目录快速查找文件。我发现它工作得很好,并通过打开和关闭一个新的搜索缓冲区来利用 Vim 的自动完成功能。它还尽可能为您巧妙地完成,因此您通常只需键入一两个字符并在项目中的任何目录中打开文件。我开始使用它是因为一个 Java 项目,它为我节省了很多时间。您只需在开始编辑会话时通过键入 :FC(目录名称)构建一次缓存。您也可以只使用 . 获取当前目录和所有子目录。之后你只需输入 :FF (或 FS 打开一个新的拆分),它会打开一个新的缓冲区来选择你想要的文件。选择文件后,临时缓冲区关闭,您位于请求的文件中,可以开始编辑。是 Stack Overflow 上的另一个链接,可能会有所帮助。

于 2009-12-20T11:12:22.007 回答
0

http://content.hccfl.edu/polllock/Unix/FindCmd.htm

linux/unix“查找”命令。

于 2009-03-18T02:18:25.753 回答
0

是的,bash具有文件名完成机制。我自己不使用它们(懒得学习,而且我发现没有必要经常使它变得紧急),但基本机制是键入前几个字符,然后是一个制表符;只要名称明确,这将尽可能地扩展名称(也许根本不会)。好的 ol' 手册页中有大量与完成相关的 Emacs 样式命令。

于 2009-03-18T02:36:43.213 回答
0

locate <file_pattern>

***find肯定会起作用,并且可以针对特定目录。但是,此命令比locate命令慢。在 Linux 操作系统上,每天早上都会构建一个数据库,其中包含所有目录和文件的列表,并且该locate命令有效地搜索该数据库,因此如果您想搜索今天未创建的文件,这将是完成此类任务的最快方法。

于 2017-10-31T23:38:53.783 回答