我喜欢 BASH,但在 GREP 上遇到了困难。
我的目标很简单:GREP 我的桌面文件中的“0.jpg”。
我的 BASH 代码:
$ pwd
/Users/jennalusche/Desktop
$ grep "0" *.jpg
预期结果:
0.jpg
实际结果:
Binary file IMG_2125.jpg matches
Binary file the-letter-just-j-bw-vectorized-v2.jpg matches
操作系统
Mac OS X 优胜美地
我的问题
为什么 GREP “0” *.jpg 显示二进制文件而不是名为“0.jpg”的单个文件?
我的调试原理
我假设这些文件出现的原因是它们都是“二进制”。 “二进制文件”= 文件以 0 和 1 编码。因此,显示的两个文件都必须转换为 0,而我的 PWD 中的所有其他文件都转换为 1。
我的明显问题——
为什么输出不是 0.jpg?
理由检查
我假设两个输出文件(以二进制形式)均为 0,而 PWD 中的所有其他文件均为 1。这个假设正确吗?
掉进兔子洞——
为什么生成的文件都是0?我没有故意以任何特殊方式对这些文件进行编码。我的 GREP 搜索中未显示的文件是否编码为 1?如果是这样,为什么?
滚入更深的兔子洞 — GREP。 SED。 AWK。 LS。猫。回声。寻找。
显然,这些实用程序的功能有很多重叠。
就使用而言,您最喜欢的组合是什么?
答案1
实用性grep
查看文件内部用于匹配正则表达式的行。
您(似乎)想要做的是列出当前目录中0
文件名中包含(零)且文件名后缀为.jpg
.为此,您可以使用类似的东西
ls -l ./*0*.jpg
或者确实只是
echo ./*0*.jpg
模式的第一部分*0*
会匹配任何包含零的字符串,而模式的最后部分.jpg
会将生成的文件名限制为以该后缀结尾的文件名。这./
意味着“在此目录中”,并且仅当您的文件名以(破折号)开头时才真正需要-
(否则这些文件可能会被误解为命令行选项)。
此模式的扩展是由 shell 在调用之前完成的ls
,因此ls
将获得与该模式匹配的文件名的扩展列表并列出这些文件名。
请注意,文件名通配符模式不是正则表达式(仅相似的给他们)。 grep
另一方面,采用一个或多个正则表达式并在文件内容中搜索它们。
回答发现的问题在评论中:“警告”是一种非致命的形式诊断输出。另一种类型是“错误”,通常是致命的(即程序无法照常继续,并在输出错误消息后终止)。
诊断消息通常不被视为命令在正常操作期间产生的标准输出的一部分,并且通常在特殊的“输出流”上产生(在所谓的“标准错误流”上,而不是在“标准输出流”上)以便可以单独检查或丢弃它,并且不会干扰命令的普通输出。
但在这种情况下,grep
实际上无法展示与模式匹配的数据,因为文件是二进制的,并且数据很可能无法打印,因此它会通过消息通知您文件中存在匹配项Binary file IMG_2125.jpg matches
(这实际上不是诊断警告消息,因为迈克塞夫建议)。
1 请注意,如果某些文件名包含反斜杠字符,某些echo
实现会将\n
, \b
... 解释为转义序列以进行扩展。