繁体   English   中英

哪个更有效:ls -l * ABC * vs ls -l | grep ABC

[英]Which is more efficient : ls -l *ABC* vs ls -l | grep ABC

至少有两种方法可以执行相同的操作:) ls -l *ABC*ls -l | grep ABC ls -l | grep ABC

但是哪个更有效? 还有其他更有效的方法吗?

他们做了两件事。

ls -l *ABC*列出当前目录中名称包含ABC所有条目(而不以.开头)。

ls -l | grep ABC ls -l | grep ABC列出了当前目录中名称不以开头的所有条目. 然后过滤掉所有不包含ABC

ls -l列出了用户名和组名以及文件名,因此,如果碰巧一个名称包含ABC的用户或组拥有的文件,则将列出这些文件,而不管其名称如何。 大多数组名和用户名都不包含大写字母,但这不是一个严格的要求,您将希望对其他模式(例如abc执行相同的操作。 如果该模式恰好包含在单词total ,则将匹配ls -l输出的第一行。

更晦涩的是,文件名可以合法地包含/以外的任何字符以及空字符-包括换行符。 使用这样的名称确实不是一个好主意,但是这样的文件名称将在两行或更多行中列出,并且grep在一行上进行操作。

ls -l的输出旨在使人可读。 它并不是真正要自动处理的。

ls -l *ABC*更清楚,直接地说明您的意思。 在考虑性能之前先考虑一下。 除非当前目录肯定很大,否则任何性能差异都可能会被打印输出所花费的时间所淹没。

说了这么多,让我们看一下可能的性能问题。

ls -l *ABC**ABC*通配符由外壳处理; ls仅看到参数列表。 它要求外壳程序扫描当前目录并构建与模式匹配的文件名的排序列表。 然后, ls命令将再次对它排序(并且取决于您的shell和区域设置,我不确定两种排序都将产生相同的顺序)。 对于很大的目录,排序可能是性能问题。 (解决方案:避免建立非常大的目录。) ls排序的项目将比shell少-除非当前目录中的所有内容都匹配*ABC*

ls -l | grep ABC ls -l | grep ABCls命令必须扫描当前目录,对所有目录进行排序,获取所有内容的元数据,然后打印所有内容,以使(大部分)大部分内容由单独的grep进程过滤掉。

我不知道哪个会更快。 它可能取决于当前目录的内容。 但是除非您使用的是大型目录或执行多次此操作,否则性能差异可能并不重要。 如果确实重要,请对其进行测量; 这是了解环境差异的唯一方法。

Glob vs Grep。

ls -l *ABC*工作方式是通配符匹配正则表达式,并填充与该正则表达式匹配的文件名数组。 一旦完成,ls就会以长-l格式列出文件。

ls -l | grep ABC ls -l | grep ABC使用linux管道。 管道的工作方式是将左命令的STD_OUT连接到右命令的STD_IN。 因此,ls -l首先生成长格式所有文件名的列表,然后通过管道将此列表传递给grep,grep根据其匹配的正则表达式过滤掉该列表。 现在,假设此列表包含一百万个文件,那么当glob可以为您填充该列表时,就不必传递整个列表。

因此, ls -l | grep ABC ls -l | grep ABCls -l *ABC*慢得多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM