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