搜索特定文件并切换到其目录

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)

Kus*_*nda 6

两部分:查找文件和切换到找到文件的目录。

查找文件

如果您想在系统的文件层次结构中的某个位置找到某个文件的名称,那么您会立即想到两种方法:

  1. 使用find.
  2. 使用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)

这里somecommandfindlocate如上。

head -n 1将从列表中挑选出第一个结果,并dirname仅提取包含该文件的目录的路径。 cd然后将工作目录更改为该目录。

请注意,如果您使用locate,则匹配项还可能包含非常规文件(例如目录)的名称。