从命令行查找目录中的文件
Posted
技术标签:
【中文标题】从命令行查找目录中的文件【英文标题】:Find file in directory from command line 【发布时间】:2010-10-13 23:49:47 【问题描述】:在eclipse和textmate等编辑器/ide中,有快捷方式可以快速找到项目目录中的特定文件。
是否有类似的工具可以在 bash 或其他 shell 中对目录中的文件名(递归)进行完整路径补全?
我的项目有很多目录,而且目录很深(叹气,java)。 在 shell 中点击选项卡只会循环遍历当前目录中的文件,这还不够 =/
【问题讨论】:
How do I find all files containing specific text on Linux?的可能重复 【参考方案1】:find /root/directory/to/search -name 'filename.*'
# Directory is optional (defaults to cwd)
支持标准 UNIX 通配符。请参阅man find
了解更多信息。
如果你使用 Vim,你可以使用:
:e **/filename.cpp
或:tabn
或任何接受文件名的 Vim 命令。
【讨论】:
@Bryan Oakley,感谢您的编辑,但它覆盖了我对 Vim 的补充!我在我的答案中改写了目录参数。谢谢。 感谢 vim 提示。这是一个有用的,我仍然不知道:P 有没有办法在当前目录中执行此操作而无需一路输入? 这里尝试使用别名来搜索当前目录alias ff="find . -name "
。用法:ff Rand*
ff exactname.c
等【参考方案2】:
http://content.hccfl.edu/pollock/Unix/FindCmd.htm
linux/unix“查找”命令。
【讨论】:
【参考方案3】:是的,bash
具有文件名完成机制。我自己不使用它们(懒得学习,而且我发现没有必要经常使它变得紧急),但基本机制是键入前几个字符,然后是一个制表符;只要名称明确,这将尽可能地扩展名称(也许根本不会)。好的 ol' 手册页中有大量与完成相关的 Emacs 样式命令。
【讨论】:
【参考方案4】:当我在 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”有太多的目录需要递归......然后它会变得很慢。 (例如,您不希望从根“/”开始执行此操作)
【讨论】:
【参考方案5】:如果您希望对文件列表执行某些操作,可以将 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')
这样做。
【讨论】:
【参考方案6】:我使用这个script 在项目中跨目录快速查找文件。我发现它工作得很好,并通过打开和关闭一个新的搜索缓冲区来利用 Vim 的自动完成功能。它还为您尽可能智能地完成,因此您通常只需键入一两个字符并在项目中的任何目录中打开文件。我开始使用它是因为一个 Java 项目,它为我节省了很多时间。您只需在开始编辑会话时通过键入 :FC(目录名称)构建一次缓存。您也可以只使用 .获取当前目录和所有子目录。之后你只需输入 :FF (或 FS 打开一个新的拆分),它会打开一个新的缓冲区来选择你想要的文件。选择文件后,临时缓冲区关闭,您位于请求的文件中,可以开始编辑。此外,here 是 Stack Overflow 上的另一个链接,可能会有所帮助。
【讨论】:
【参考方案7】:locate <file_pattern>
*** find
当然可以,并且可以针对特定目录。但是,此命令比locate
命令慢。在 Linux 操作系统上,每天早上都会构建一个包含所有目录和文件列表的数据库,locate
命令有效地搜索这个数据库,所以如果你想搜索今天没有创建的文件,这个将是完成此类任务的最快方法。
【讨论】:
【参考方案8】:我使用 ls -R,像这样通过管道传递给 grep:
$ ls -R | grep -i "pattern"
-R 表示递归列出所有文件,-i 表示不区分大小写。最后,模式可能是这样的:“std*.h”或“^io”(文件名中以“io”开头的任何内容)
【讨论】:
以上是关于从命令行查找目录中的文件的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )
Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )