如何根据大小列出所有目录?

如何根据大小列出所有目录?

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

我心里有这样的想法:

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 中,使用Dglob 限定符在文件名模式中包含点文件:

du -s -- *(D) | sort -k1n

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

shopt -s dotglob
du -s -- * | sort -k1n

在 ksh 中,设置FIGNORE.?(.)仅忽略.而不..忽略其他点文件。

FIGNORE='.?(.)'
du -- * | sort -k1n

也可以看看如何将一个目录中的所有文件(包括隐藏文件)移动到另一个目录中?

相关内容