转到包含特定文件的目录的最佳方法是什么? (假设我们从我们希望搜索的根部开始)。我正在使用 Cygwin。
解决方案:我的最终解决方案是将其放入我的 .bashrc 文件中。
jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}
alias jump2=jump2_func
答案1
两个部分:查找文件,并更改到找到的文件的目录。
查找文件
如果您想要在系统文件层次结构中的某个位置找到某个文件的名称,那么您会立即想到两种方法:
- 使用
find
。 - 使用
locate
。
要使用以下命令查找文件find
:
$ find / -type f -name "filename" -print
这将从 root( /
) 向下遍历整个文件系统,并打印出所有调用的常规文件的完整路径filename
。更改/
为您要从中搜索的任何目录路径。
要查找文件,请使用locate
:
$ locate -r -b '^filename$'
这将输出名称为 的所有文件(和目录等)的所有路径filename
。这通常是很多比使用更快find
。我-r
在这里使用正则表达式来匹配完整的文件名,否则您可能会得到像file3
搜索file
.该-b
选项locate
仅与路径的“基本名称”匹配,即每个路径末尾的实际文件名。
为了能够locate
在 Cygwin 上使用,您首先必须初始化“locate
数据库”。你可以通过运行来做到这一点
$ updatedb
缺点是它只知道运行locate
时存在的文件的位置。updatedb
这就是为什么大多数 Unix 系统通常定期使用(我认为 Cygwin 中不可用)locate
运行updatedb
(或等效命令) ;cron
在某些 Linux 上每天一次,或者在 OpenBSD 上默认每周一次。
更改到找到的文件的目录
由于这些方法都不能保证仅返回一文件路径,很难想出一种可靠的方法将工作目录更改为找到的文件的目录(如果有很多,选择哪一个?)。
假设您想选择第一的结果:
cd "$( dirname "$(somecommand | head -n 1)" )"
这里somecommand
是find
或者locate
如上所述。
head -n 1
将从列表中选出第一个结果,并dirname
仅提取包含该文件的目录的路径。 cd
然后将工作目录更改为该目录。
请注意,如果您使用locate
,那么匹配项可能还包含非常规文件(例如目录)的名称。
答案2
cd "$(find . -name filename -printf %h -quit 2>/dev/null)"
如果没有找到具有该名称的文件,则cd
更改为主目录。如果这不是想要的那么你需要这样的东西:
dir="$(find . -name filename -printf %h -quit 2>/dev/null)"
test -d "$dir" && cd "$dir"