find . -name "*.html" -exec grep -l somethingtobefound {} \;
我只是想知道关键字“-name”“-exec”“-l”“{}”“\”和“;”应该表示。
另外,我经常看到在很多情况下使用双破折号“--”而不是单破折号“-”。我想知道它们是否可以互换,以及它们的含义。谢谢你!
答案1
这不是一个bash问题本身-- 该命令中的所有内容都是 unix find(1) 命令的一组参数,无论您从哪个 shell 调用它,它的行为都是相同的。
鉴于此,您真正需要做的是查看 find(1) 的文档 - 您可以通过运行以下命令来做到这一点:
$ man find
或者,如果您的 find 版本是 Gnu 版本(如果您运行的是 Linux,则会如此),
$ info find
以获得更像书本的文档。
对于第二个问题:许多命令(特别是那些属于 Gnu 项目的命令)使用以下形式的长选项标志
$ command --long-argument --other-long-argument
作为形式短参数的替代
$ command -lo
或者
$ command -l -o
。这样做的命令将在此类标志的开头使用“--”而不是“-”,以明确即将出现哪种类型的选项标志。
答案2
在此上下文中,-name
告诉find
命令过滤结果以查找以“.html”结尾的结果,并-exec
告诉命令使用结果find
运行。grep
应用于-l
命令并指示应打印grep
与模式(即 )匹配的第一个输入文件的文件名并停止扫描。somethingtobefound
根据该man
页面,{}
确保传入当前文件的路径名find
并\;
终止命令。
关于双破折号与单破折号,这往往是特定于程序的,不应该具有任何特殊含义。也就是说,通常您倾向于在较长的参数(即--show-results
)与单字符参数(即)之前看到双破折号-s
。
答案3
可以通过 man find 找到答案:
`
-name pattern
Base of file name (the path with the leading directories
removed) matches shell pattern pattern. The metacharacters
('*', '?', and '[]') match a '.' at the start of the base name
(this is a change in findutils-4.2.2; see section STANDARDS CON‐
FORMANCE below). To ignore a directory and the files under it,
use -prune; see an example in the description of -path. Braces
are not recognised as being special, despite the fact that some
shells including Bash imbue braces with a special meaning in
shell patterns. The filename matching is performed with the use
of the fnmatch(3) library function. Don't forget to enclose
the pattern in quotes in order to protect it from expansion by
the shell.
-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. See the EXAMPLES sec‐
tion for examples of the use of the -exec option. The specified
command is run once for each matched file. The command is exe‐
cuted in the starting directory. There are unavoidable secu‐
rity problems surrounding use of the -exec action; you should
use the -execdir option instead.
等等
答案4
参数-name
和-exec
表示“要搜索的文件或目录名称模式”和“执行某物在每个匹配的结果文件或目录上”。 被{}
替换为与模式匹配的结果-name
,以便-exec
语句可以将它们用作执行命令的参数。反斜杠\;
表示 find 命令的结束。双破折号--
通常表示长选项egls --all
和单破折号-
表示短选项eg ls -a
,它们的含义完全相同。