$ find -exec cd => 给出错误:=> find: 'cd': 没有这样的文件或目录

$ find -exec cd => 给出错误:=> find: 'cd': 没有这样的文件或目录

当我运行此命令时,它会起作用:

$ 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

但是,当lscd它替换时不是工作:

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

我知道cdbash内置的,所以我尝试了这个不是工作:

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

如何cdfind -exec命令一起使用?


更新

我尝试使用cdwith 的原因find -exec是目录名称很奇怪,在我的终端上显示为类似????.

答案1

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

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

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

有关的:


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

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

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

cd thedir

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

答案2

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 扩展),停止关注第一个匹配作为优化。

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

find . -inum 888696 -exec bash -c 'cd "$1" && exec bash' sh {} \;

答案3

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

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

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

答案4

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

现在给你带来坏消息:

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

cd如果你想让执行的命令有效find,你可以这样做:

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

相关内容