当我运行此命令时,它可以工作:
$ 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
目录名称是一个奇怪的名称,它在我的终端上显示为????
.
执行外部实用程序的
-exec
选项,可能带有一些命令行选项和其他参数。find
您的 Unix 不提供
cd
作为外部实用程序,仅作为内置 shell,因此find
无法执行它。至少 macOS 和 Solaris确实提供cd
了外部实用程序。以这种方式执行几乎没有用处
cd
,除非作为一种测试找到的路径名是否find
是您可以进入的目录的方法cd
。交互式 shell(或任何调用的)中的工作目录find
无论如何都不会改变。有关的:
如果您遇到目录名称奇怪或极难键入的问题,并且您想更改为该目录,请考虑创建一个指向该目录的符号链接,然后
cd
使用该链接进入该目录:这将创建一个名为的符号链接
thedir
,该链接将指向有问题的目录。然后,您可以更改工作目录(如果链接存在于当前目录中)。这样可以避免以任何方式修改目录。另一个想法是以与 类似的方式重命名目录
find
,但如果另一个程序希望目录具有该特定名称,则不建议这样做。find
运行-exec
命令本身,它不涉及 shell。即使这样做了,目录的更改也只会持续到该 shell 退出,紧接着cd
.您需要将文件名取出到当前的 shell 中才能
cd
进入它。根据您的文件名有多糟糕,您可以使用命令替换:如果文件名以换行符结尾,那将不起作用,因为命令替换会吃掉尾随的换行符。在这种情况下,您需要保护换行符并
find
在打印时删除一个添加:或者,使用 GNU
find
,让它不打印尾随换行符(但仍保护文件名中的任何内容):还使用
-quit
谓词(也是 GNU 扩展)来停止将第一个匹配项作为优化。或者,您可以从 inside 启动一个新的 shell
find
,但这有点难看:不使用 exec,但这对您来说可能已经足够了:
“-type d”,只是为了确定。至于什么,我真的不知道。
使用 NUL 分隔的流来读取
find
在所有情况下都有效的输出 - 包括以换行符结尾的名称。此外,您可以使用它printf '%q'
来生成文件名的可读表示。如果您收到此消息,则说明您的操作系统平台有问题。POSIX 标准要求
cd
文件系统中必须有一个名为的命令,以便可以通过exec()
.现在对你来说是个坏消息:
即使您的操作系统平台没有问题,您也只是没有看到警告,但您没有得到预期的结果,因为如果单独的程序更改其当前工作目录并在此之后立即死亡,它对您没有帮助。
如果您希望
cd
在 执行的命令中生效find
,您可以执行以下操作: