如何根据大小列出所有目录?[不包括父目录]

Kar*_*ick 6 command-line ls shell find disk-usage

我有一堆随机文件夹,其中一些是隐藏的(以句点开头)。我想列出所有这些,按它们的大小排序。

我有一些关于这一点的想法:

ls -d -1 -a */ | xargs du -s | sort
Run Code Online (Sandbox Code Playgroud)

ls ...它的一部分不显示隐藏文件。我知道之前曾就同一主题提出过一些问题,但答案从未包括包含隐藏文件的方法。或者,如果是,则使用长格式,从而使输出与命令的其余部分不兼容。

Cal*_*leb 13

解析的输出ls始终存在问题。如果您打算自动处理输出,则应始终使用不同的工具。

在您的特定情况下,您的命令失败了 - 不是因为缺少某些参数或不兼容的参数ls- 而是因为您发送的 glob 。您要求ls列出所有结果,包括带有 的隐藏结果-a,但随后您迅速要求它仅列出与*/glob 模式匹配的事物,而这些事物与glob 模式匹配,.并且任何ls可能做的事情都仅限于与 glob 匹配的事物。您也可以用作.*/第二个 glob 来匹配隐藏目录,或者您可以完全关闭 glob 并让我们ls完成工作。但是,ls如果您有一个要匹配的 glob ,您甚至不需要这样做。

一种解决方案是ls完全跳过,只使用 shell globing:*

$ du -s */ .*/ | sort -n
Run Code Online (Sandbox Code Playgroud)

对于这个例子来说可能有点矫枉过正但在更复杂的情况下非常强大的另一种方法是使用find:*

$ find ./ -type d -maxdepth 1 -exec du -s {} + | sort -n
Run Code Online (Sandbox Code Playgroud)

解释:

  • find ./ 在当前目录上启动查找操作。如果您愿意,可以使用其他路径。
  • -type d 仅查找目录中的内容
  • -maxdepth 1 告诉它只在当前目录中查找目录,而不是递归到子目录。
  • -exec [command] [arguments] {} +工作起来很像xargs,但是find在引用和转义名称时可以完成所有繁重的工作。该{}位被查找的结果替换。
  • du -s 你懂

* 请注意,在这种情况下,我使用-n运算符 forsort来获得比字母更有用的数字排序。


Gil*_*il' 8

在 zsh 中,使用Dglob 限定符在文件名模式中包含点文件:

du -s -- *(D) | sort -k1n
Run Code Online (Sandbox Code Playgroud)

在 bash 中,设置dotglob选项以生成*匹配点文件:

shopt -s dotglob
du -s -- * | sort -k1n
Run Code Online (Sandbox Code Playgroud)

在KSH,设定FIGNORE.?(.)忽略只...而不是其他点文件。

FIGNORE='.?(.)'
du -- * | sort -k1n
Run Code Online (Sandbox Code Playgroud)

另请参阅如何将目录中的所有文件(包括隐藏文件)移动到另一个目录?.