【问题标题】:How to find -exec cd in linux / unix如何在 linux / unix 中找到 -exec cd
【发布时间】:2011-06-13 21:17:41
【问题描述】:

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

寻找 。 -name "配置" -exec cd {} \;

有一个匹配,./my-applications/config,但在我尝试后它说:

find: `cd': 没有这样的文件或目录

我做错了什么?

【问题讨论】:

    标签: linux unix find exec


    【解决方案1】:

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

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

    用途:

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

    请注意,如果找不到您的目录,则命令完成后您将返回主目录。 (sed 1q 确保您只将一个目录名称传递给 cd;Korn shell cd 在命令中采用两个值并执行一些相当合理的操作,但 Bash 忽略了额外的内容。)

    【讨论】:

    • 像 Solaris 这样的一些操作系统在 /usr/bin 中确实有一个 cd,但这当然不会改变他们无法更改当前 shell 目录的事实。
    • 优秀。我没有意识到 cd 是一个内置的 shell。这解释了它!
    • 如果你需要cd和其他命令,你可以随时使用sh -c,例如find . -name "config" -type d -exec sh -c "cd {}; git pull" \;
    【解决方案2】:

    如果您有多个配置目录:

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

    【讨论】:

    • 我知道这是旧的,但 select 应该是 for
    • @Roger 我相信selectfor 更好。如果有多个config目录,用户可以选择cd在哪个目录,而接受的答案则使用找到的第一个,这是一个相当随意的选择。
    • 也许是 bash?似乎在 sh 中不起作用。
    • @Roger 你在运行一个古老的 Bourne shell 吗?它是如何失败的?
    【解决方案3】:

    find-exec 程序作为子进程运行,子进程不能影响其父进程。所以,是做不到的。你可以试试

    cd `find . -name "config"`
    

    【讨论】:

    • 使用$(...) 比使用反引号更好。
    • 最好做一个find . -type d... 这样您就不会尝试将cd 放入文件中:-)
    猜你喜欢
    • 2010-09-23
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2013-07-03
    • 2022-01-25
    • 2023-02-01
    相关资源
    最近更新 更多