用户定义动作是 Linux 中 Bash 的一个功能。在 Linux 终端中如果我写
root@localhost: find ~ -type f -name 'foo*' -ok ls -l '{}' ';'
然后它检查是否有任何以以下开头的文件名foo
并显示文件详细信息,如下所示:
< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me me 224 2011-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me me 0 2012-09-19 12:53 /home/me/foo.txt
只要我按下y它就会显示这些结果。
我的问题是这些字符的特殊含义是什么'{}' ';'
?
{}
我在代表当前路径的地方读到并';'
结束命令,但在 bash 中我从来没有以';'
.
答案1
这些不是 bash 的一部分;find
是一个独立程序并且不需要 bash 甚至 POSIX shell 来运行。例如,它可以很好地与 配合使用fish
,但它不符合 POSIX 标准,并且不遵循与 bash 相同的语法规则。事实上,您完全可以在没有 shell 的情况下使用它(例如,在编程上下文中)。
这就是为什么(如果您使用的是 POSIX shell,或者在本例中具有类似规则的 shell)您希望使用带有某些参数的引号,find
例如find . -name '*foo'
.单引号中的字符串将被传递,而不执行任何替换或扩展。 shell 对此不做任何事情。如果您find . name *foo
与 bash 一起使用,并且当前目录中恰好存在与该 glob 匹配的文件,那么您想要发生的事情可能不会发生。
如果您使用具有不同规则的 shell,则在使用 时必须考虑这些规则find
。例如,您实际上不需要引用{}
with bash
,但如果您对 with 做同样的事情fish
,您将得到find: missing argument to '-exec'
.
大括号在 bash 中确实有意义——它们用于参数替换/扩展以及对命令进行分组。它们在 中具有类似的目的find
,但解析它们的是find
它们,而不是bash
。
答案2
虽然都有大括号{
和}
分号;
做在 bash 中具有特殊含义,在这种情况下,find
解释它们的是命令本身,而不是 shell。命令使用与其命令相同-ok
的find
语法,因此您可以在其手册页 ( )-exec
的该部分找到完整的说明:man find
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a `\') or quoted to
protect them from expansion by the shell.