有没有一种方法可以一步到位地找到特定文件并进入包含它的目录?

4
我正在寻找一种方法,可以找到一个我知道是唯一的文件,然后进入包含该文件的目录。大致上应该像这样:
find . -name 'Subscription.java' | xargs cd

或者:
find . -name 'Subscription.java' -exec cd {} \;

我知道这个命令行不会生效,因为它试图使用整个绝对路径(包括文件名)去执行 cd 命令,并且 xargs 无法执行内置的 shell 命令,但是你可以理解我想要实现的目标。

3个回答

7
cd $(find . -name Subscription.java | xargs dirname)

正是我正在寻找的命令。我知道它存在,但不知道该死的命令是什么。太棒了。谢谢。 - bergyman
1
对于那些不知道如何做到这一点的人,我只是将其放入了一个shell函数中:
function fcd()
{
cd $(find . -name $1 | xargs dirname)
}
- bergyman
2
cd $(dirname $(find . -name $1 | sed 1q)) 处理不唯一的名称,会进入第一个找到的名称并且如果未找到该名称,则返回主目录。 它还演示了嵌套使用 $(...) 的方法,这就是为什么该符号比反引号更受欢迎的原因。您可能更喜欢使用 'sed '2,$d'' ,因为它避免了 SIGPIPE 错误干扰 find - Jonathan Leffler
使用sed 1q很好。我需要更深入地了解sed - 我对它不是很了解。 - bergyman
如果你想进入可执行文件所在的目录,还有其他有用的变体:wcd() { cd $(dirname $(which $1)); }或者wcd() { cd $(dirname $(type -p $1)); }或者wcd() { local dir=$(type -P $1); [[ -z $dir ]] && dir='.'; cd "${dir%/*}"; }。最后一种方法不会产生任何外部程序,并且如果找不到该名称,则不会更改目录。 - Dennis Williamson

0

Linux/OSX(另一种答案):

cd `find . -name Subscription.java | xargs dirname`

0
任何尝试编写 cd 命令的脚本都必须确保该命令在当前 shell 中运行。否则,如果在子 shell 中运行,它将无法按照您需要的方式工作,因为父进程的当前工作目录不会更改。
GNU find 具有 -printf 选项,可用于打印找到的任何文件的目录。find 的输出可以通过命令替换传递给 cd
cd $(find . -name Subscription.java -printf '%h\n')

在bash中,cd命令会忽略额外的参数,因此如果找到多个文件,cd将切换到第一个找到的文件所在的目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接