如何在Linux/Unix中查找-exec cd

19

我正在寻找一个配置文件夹,并尝试切换到该目录:

find . -name "config" -exec cd {} \;

这里有一个匹配项,./my-applications/config,但是在我尝试后,它显示:

find: `cd': 没有那个文件或目录

我做错了什么?

3个回答

23

cd命令是一个shell内置命令,不在/bin/usr/bin中找到。

当然,您不能将目录更改为文件,并且您的搜索不限于目录。 cd命令只会影响执行的命令,而不是执行find命令的父shell。

使用:

cd $(find . -name config -type d | sed 1q)

请注意,如果找不到您的目录,在命令完成时,您将返回到您的主目录。(sed 1q 确保您只向 cd 传递一个目录名称;Korn shell 的 cd 在命令中需要两个值并执行一些相当明智的操作,但 Bash 忽略了多余的值。)


1
一些操作系统(如Solaris)在/usr/bin中确实有cd命令,但这并不改变它们无法更改当前shell目录的事实。 - jlliagre
太好了。我没有意识到cd是一个shell内置命令。这就解释了一切! - cwd
4
如果你需要使用_cd_和另一个命令,你可以始终使用sh -c,比如find . -name "config" -type d -exec sh -c "cd {}; git pull" \; - DiegoG

4

如果您有多个配置目录:

select config in $(find . -name config -type d)
do
  cd $config
  break
done

我知道这很旧,但select应该改成for吗? - Roger
@Roger 我认为在这里使用 selectfor 更好。如果有多个 config 目录,用户可以选择要进入哪一个,而采用被接受的答案,则会使用找到的第一个目录,这是相当随意的选择。 - jlliagre
也许是bash?在sh中似乎无法工作。 - Roger
@Roger 你在运行一个古老的 Bourne shell 吗?它是如何失败的? - jlliagre

2

find命令通过作为子进程运行-exec程序,而子进程无法影响其父进程。因此,这是不可能的。你可以尝试

cd `find . -name "config"`

最好使用$(...)而不是反引号。 - Jonathan Leffler
2
最好执行 find . -type d... 命令,这样你就不会尝试进入一个文件了 :-) - Fredrik Pihl

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