说我要检查某个目录中每个文件的大小。
这是我的工作:
du -sh *
另外,我可以这样做:
ls | xargs du -sh
这两个命令执行完全相同的操作。
我想知道它们是否完全相同,例如它们的成本,效率等。(我猜第一个命令比第二个命令轻吗?)
一个是正确的,另一个是不正确的。
du -sh *
(应du -sh -- *
避免以开头的文件名出现问题-
)
依靠壳扩大球*
; du
将当前目录中的所有非隐藏文件和目录视为单独的参数。这样可以正确处理特殊字符。
ls | xargs du -sh
依赖于xargs
处理ls
的输出。xargs
在空格(至少空格,制表符和换行符,在某些实现中更多)上拆分其输入,还理解某种形式的引用,并du
使用每个由空格分隔的单个字符串运行(一个(即使是空输入¹)或更多次调用)个别论点。
如果当前目录中不包含名称中包含空格,单引号,双引号或反斜杠字符的文件,并且文件数量很少(但至少有一个)xargs
仅运行一次du
调用,则两者都看起来相同不是。
就效率而言,du -sh *
使用一个过程,ls | xargs du -sh
至少使用三个过程。有一个场景,其中所述管的方法将工作,而水珠不会:如果你在当前目录下的文件太多,外壳将无法运行du
在一个全力以赴自己的名字,而是xargs
将运行du
作为覆盖所有文件所需的时间很多次,在这种情况下,您会看到几行,并且具有多个硬链接的文件可能会被计算多次。
另请参见为什么*不*解析`ls`?
¹如果当前目录中没有未隐藏的文件,du -sh -- *
则可能由于您的shell错误而失败,或者由于某些shell(例如以文字作为参数bash
运行)du
而失败,*
并du
会抱怨该*
文件不存在。
使用时ls | xargs du -sh --
,大多数xargs
实现(某些BSD除外)将du
不带任何参数运行,因此给出当前目录的磁盘使用情况(因此还包括目录文件本身及其中所有隐藏文件和目录的磁盘使用情况)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句