搜索特定文件并更改到其目录

搜索特定文件并更改到其目录

转到包含特定文件的目录的最佳方法是什么? (假设我们从我们希望搜索的根部开始)。我正在使用 Cygwin。

解决方案:我的最终解决方案是将其放入我的 .bashrc 文件中。

jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}

alias jump2=jump2_func

答案1

两个部分:查找文件,并更改到找到的文件的目录。

查找文件

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

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

这里somecommandfind或者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"

相关内容