有没有办法find一个特定的文件,然后更改到包含它一目了然的目录?

我正在寻找一种方法来find我所知道的将是一个独特的文件,然后切换到包含该文件的目录。 有些东西是:

find . -name 'Subscription.java' | xargs cd 

要么:

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

我知道这是行不通的,因为它都试图提供包含该文件的整个绝对path,也因为xargs不能执行任何内置的shell命令,但是您已经完成了我想完成的任务。

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

任何编写cd命令的脚本都必须确保命令在当前shell中运行。 否则,如果在子shell中运行,它不会像你所需要的那样工作,因为父目前的工作目录不会被改变。

GNU find有-printf可以用来打印任何找到的文件的目录。 find的输出可以通过命令替换传递给cd

 cd $(find . -name Subscription.java -printf '%h\n') 

cd(在bash中)忽略额外的参数,所以如果找到多个文件,cd会变成第一个找到的文件的目录。

Linux / OSX(替代答案):

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