当我运行此命令时,它会起作用:
$ 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
with 的原因find -exec
是目录名称很奇怪,在我的终端上显示为类似????
.
答案1
-exec
执行外部实用程序的选项,find
可能带有一些命令行选项和其他参数。
您的 Unix 不提供cd
外部实用程序,仅作为内置 shell 提供,因此find
无法执行它。至少 macOS 和 Solaris做cd
作为外部实用程序提供。
以这种方式执行几乎没有用处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 {} \;