AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 447965
Accepted
user3405291
user3405291
Asked: 2018-06-06 03:17:49 +0800 CST2018-06-06 03:17:49 +0800 CST 2018-06-06 03:17:49 +0800 CST

$ find -exec cd => 给出错误:=> find: 'cd': No such file or directory

  • 772

当我运行此命令时,它可以工作:

$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst  Outlook Data File  Outlook Data File.sbd  Trash      Unsent Messages
Inbox.pst     Outlook Data File.msf  Sent.pst       Trash.msf  Unsent Messages.msf

但是,当替换ls它cd不起作用时:

$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory

我知道cd是bash内置的,所以我尝试了这个也不起作用:

$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory

如何cd与find -exec命令一起使用?


更新

我尝试使用的原因cd是find -exec目录名称是一个奇怪的名称,它在我的终端上显示为????.

bash find
  • 5 5 个回答
  • 4314 Views

5 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-06-06T03:27:17+08:002018-06-06T03:27:17+08:00

    执行外部实用程序的-exec选项,可能带有一些命令行选项和其他参数。find

    您的 Unix 不提供cd作为外部实用程序,仅作为内置 shell,因此find无法执行它。至少 macOS 和 Solaris确实提供cd了外部实用程序。

    以这种方式执行几乎没有用处cd,除非作为一种测试找到的路径名是否find是您可以进入的目录的方法cd。交互式 shell(或任何调用的)中的工作目录find无论如何都不会改变。

    有关的:

    • 了解 `find` 的 -exec 选项
    • 更改当前目录的脚本 (cd, pwd)
    • `cd` 外部命令有什么意义?

    如果您遇到目录名称奇怪或极难键入的问题,并且您想更改为该目录,请考虑创建一个指向该目录的符号链接,然后cd使用该链接进入该目录:

    find . -inum 888696 -exec ln -s {} thedir ';'
    

    这将创建一个名为的符号链接thedir,该链接将指向有问题的目录。然后,您可以更改工作目录

    cd thedir
    

    (如果链接存在于当前目录中)。这样可以避免以任何方式修改目录。另一个想法是以与 类似的方式重命名目录find,但如果另一个程序希望目录具有该特定名称,则不建议这样做。

    • 15
  2. ilkkachu
    2018-06-06T03:24:26+08:002018-06-06T03:24:26+08:00

    find运行-exec命令本身,它不涉及 shell。即使这样做了,目录的更改也只会持续到该 shell 退出,紧接着cd.

    您需要将文件名取出到当前的 shell 中才能cd进入它。根据您的文件名有多糟糕,您可以使用命令替换:

    cd "$(find . -inum 888696)"
    

    如果文件名以换行符结尾,那将不起作用,因为命令替换会吃掉尾随的换行符。在这种情况下,您需要保护换行符并find在打印时删除一个添加:

    dir=$(find . -inum 888696; echo x)
    cd "${dir%?x}"
    

    或者,使用 GNU find,让它不打印尾随换行符(但仍保护文件名中的任何内容):

    dir=$(find . -inum 888696 -printf "%px" -quit)
    cd "${dir%x}"
    

    还使用-quit谓词(也是 GNU 扩展)来停止将第一个匹配项作为优化。

    或者,您可以从 inside 启动一个新的 shell find,但这有点难看:

    find . -inum 888696 -exec bash -c 'cd "$1" && exec bash' sh {} \;
    
    • 7
  3. Gerard H. Pille
    2018-06-06T03:23:42+08:002018-06-06T03:23:42+08:00

    不使用 exec,但这对您来说可能已经足够了:

    cd "$(find . -inum 888696 -type d)"
    

    “-type d”,只是为了确定。至于什么,我真的不知道。

    • 5
  4. Charles Duffy
    2018-06-06T09:26:37+08:002018-06-06T09:26:37+08:00

    使用 NUL 分隔的流来读取find在所有情况下都有效的输出 - 包括以换行符结尾的名称。此外,您可以使用它printf '%q'来生成文件名的可读表示。

    inum=888696
    if IFS= read -r -d '' filename < <(find . -inum "$inum" -print0); then
      LC_ALL=C printf 'Located filename: %q\n' "$filename" >&2
      cd -- "$filename"
    else
      echo "No file located for inode $inum" >&2
    fi
    
    • 5
  5. schily
    2018-06-06T04:09:11+08:002018-06-06T04:09:11+08:00

    如果您收到此消息,则说明您的操作系统平台有问题。POSIX 标准要求cd文件系统中必须有一个名为的命令,以便可以通过exec().

    现在对你来说是个坏消息:

    即使您的操作系统平台没有问题,您也只是没有看到警告,但您没有得到预期的结果,因为如果单独的程序更改其当前工作目录并在此之后立即死亡,它对您没有帮助。

    如果您希望cd在 执行的命令中生效find,您可以执行以下操作:

    find . -type d -exec sh -c 'cd "$1"; some other command' dummy {} \;
    
    • 3

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve