我试图弄清楚这些命令(对于一个学校项目)有什么区别,但对我来说它被破坏或运行了超过 10 分钟~
所以,样本:
sudo find / -type f -exec 文件 '{}' ; | grep 'Shell 脚本' |厕所-l
差异:
#在 {} 处不带“”
-
sudo find / -type f -exec file {} \; | grep ’Shell script’ | wc -l
#没有\
-
sudo find / -type f -exec file ’{}’ ; | grep ’Shell script’ | wc -l
#grep 命令后不带 ' '
-
sudo find / -type f -exec file ’{}’ \; | grep Shell script | wc -l
感谢您的时间和帮助。
答案1
首先,您需要使用直引号 ( '
),而不是印刷引号,如 Steeldriver 所指出的。
其次,引号存在与否的影响会对命令本身接收的内容产生影响:
例如,您可以:
echo 'semicolon ; echo message'
此处,命令 echo1 与参数一起运行semicolon ; echo message
。因此输出将是一行
分号 ;回显消息
现在假设没有引号:
echo semicolon ; echo message
程序 echo 将以完全相同的方式运行(打印参数)。然而,不同之处在于,由于 是;
shell 的特殊字符,因此 shell 本身会以不同的方式将该行视为两个命令:
- 回显分号
- 回显消息
输出将是:
分号消息
您的行中有三个地方可以引用或不引用:
{}
如上所述GNU 查找并屏蔽某些 shell 的 {} - 哪个? 最多shell 不需要引用独立的 {},因此不会产生任何影响。
;
find
需要 a;
来完成单个参数-exec
。由于;
shell 的特殊性,它需要被引用(作为\;
,';'
或";"
,没关系,只是不作为文字;
)。否则,shell 会将其解释为查找命令,然后是以管道 ( |
) 开头的第二个命令,这会导致 shell 错误:
意外标记“|”附近出现语法错误
Shell script
对于grep
你有两个非常不同的输出。在第一种情况下,您使用单个参数 ( Shell script
) 调用 grep。在另一种情况下,它是用两个参数(first Shell
,second script
)调用的。鉴于 grep 的工作方式,在第一种情况下,它将查找在其输入中收到的包含文本的行外壳脚本。在第二个中,它将查找包含文本的行壳在名为script
.这是完全不同的行为。
这些信息应该让您弄清楚哪一行是运行的正确行,以及这样编写的原因。
1 实际上会调用一个 shell 内置函数,但我们假设它是独立/bin/echo
运行的。
最后,正确的路线可以做三件事。
- 运行命令
file
_在系统的每个文件上` - 选择包含文本的那些行(描述这些文件)外壳脚本
- 计算行数(以及 shell 脚本的行数)
(最后一个命令相当于使用grep -c
)
因此,只有在运行程序数千次(文件系统中的每个条目一次)之后,您才会收到命令的输出(这是一个数字),因此运行时间较长很正常。
您可以在跳过的文件夹中运行它,/
因此它只搜索该子树。
tee /dev/stderr
查看它正在做什么的另一种方法是在管道上插入:
find / -type f -exec file {} \; | tee /dev/stderr | grep "Shell script" | wc -l