我有一堆随机文件夹,其中一些是隐藏的(以句点开头)。我想列出所有这些,按大小排序。
我心里有这样的想法:
ls -d -1 -a */ | xargs du -s | sort
但ls ...
它的部分不显示隐藏文件。我知道以前曾就同一主题提出过一些问题,但答案从未包括包含隐藏文件的方法。或者,如果确实如此,它会使用长格式,从而使输出与命令的其余部分不兼容。
答案1
ls
解析is的输出总是有问题。如果您想自动处理输出,则应该始终使用不同的工具。
在您的特定情况下,您的命令失败 - 不是因为某些缺少或不兼容的参数ls
- 而是因为您发送的 glob。您要求ls
列出所有结果,包括隐藏的结果-a
,但随后您立即要求它仅列出与*/
全局模式匹配的内容不是匹配以 和 开头的事物,可能所做的.
任何事情ls
都仅限于与全局匹配的事物。您也可以用作.*/
第二个 glob 来匹配隐藏目录,或者您可以完全保留 glob 并让其ls
完成工作。但是,ls
如果您有一个要匹配的全局变量,则甚至不需要这样做。
一种解决方案是ls
完全跳过并仅使用 shell globing:*
$ du -s */ .*/ | sort -n
对于这个例子来说可能有点过分,但在更复杂的情况下非常强大的方法是使用find
:*
$ find ./ -type d -maxdepth 1 -exec du -s {} + | sort -n
解释:
find ./
在当前目录上启动查找操作。如果您愿意,可以使用其他路径。-type d
只查找目录中的内容-maxdepth 1
告诉它只查找当前目录中的目录,而不是递归到子目录。-exec [command] [arguments] {} +
工作方式很像xargs
,但find
在引用和转义名称时可以完成所有繁重的工作。该{}
位将被查找结果替换。du -s
你知道
* 请注意,我使用-n
运算符 forsort
来进行数字排序,在这种情况下,数字排序比字母排序更有用。
答案2
在 zsh 中,使用D
glob 限定符在文件名模式中包含点文件:
du -s -- *(D) | sort -k1n
在 bash 中,设置dotglob
选项来*
匹配点文件:
shopt -s dotglob
du -s -- * | sort -k1n
在 ksh 中,设置FIGNORE
为.?(.)
仅忽略.
而不..
忽略其他点文件。
FIGNORE='.?(.)'
du -- * | sort -k1n