关于bash:从命令行在目录中查找文件

Find file in directory from command line

在Eclipse和TextMate等编辑器/IDES中,有一些快捷方式可以快速地在项目目录中找到特定的文件。

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

我有很多目录的项目,深的项目(叹息,Java)。在shell中点击tab只会循环访问直接目录中的文件,这还不够=/


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

支持标准的Unix全局设置。有关更多信息,请参阅man find

如果使用VIM,可以使用:

1
:e **/filename.cpp

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


如果您想对文件列表做些什么,可以使用find与bash $()构造结合使用(因为允许嵌套,所以比backticks更好)。

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

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

将返回它们的列表。但这并不能真正帮助他们做些事情。

因此,让我们进一步假设您想要搜索所有这些文件中的字符串"错误"或编辑它们。您可以执行以下操作之一:

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

这样做。


当我在Unix世界(使用tcsh(sigh…)时,我使用各种"查找"别名/脚本设置来搜索文件。我认为默认的"find"语法有点笨拙,所以我以前用别名/脚本来管道"find"。-打印到grep中,它允许您使用正则表达式进行搜索:

1
2
3
4
5
# 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'

当然,上面的例子可以用普通的旧查找来完成,但是如果您有更具体的搜索,grep会有很大帮助。除非"找到",否则这个方法很有效。-print"目录太多,无法循环使用…然后它变得相当慢。(例如,您不希望从根目录"/"开始执行此操作)


我使用这个脚本可以快速地在项目的目录中找到文件。我发现它工作得很好,并且通过打开和关闭搜索的新缓冲区来利用Vim的自动完成功能。它还可以为您智能地完成尽可能多的工作,因此您通常只需键入一两个字符,然后在项目中的任何目录中打开文件。我开始使用它特别是因为一个Java项目,它节省了我很多时间。当您开始编辑会话时,只需输入:fc(目录名)一次构建缓存。您也可以使用。获取当前目录和所有子目录。之后,只需键入:ff(或fs以打开新的拆分),它将打开一个新的缓冲区以选择所需的文件。选择文件后,临时缓冲区将关闭,并且您位于请求的文件中,可以开始编辑。此外,这里还有另一个关于堆栈溢出的链接,可能会有所帮助。


locate

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


是的,bash有文件名完成机制。我自己不使用它们(太懒了,学不起来,而且我觉得没有必要经常这么急),但基本的机制是键入前几个字符,然后再键入一个制表符;只要名称不含糊,这将尽可能地扩展名称(也许根本不需要)。在good ol'手册页中有大量与完成相关的emacs样式的命令。


http://content.hccfl.edu/pollock/unix/findcmd.htm(中文)

linux/unix"find"命令。