du 只查看目录并按大小排序
du to just look at directories and sort by size
关于这个的话题很长,我已经阅读了我能找到的所有内容,但他们没有回答我的问题。
以下是我能找到的在文件夹中获得格式良好的 du
列表的最佳方法:
du -hsc $(ls -A) | sort -h
但是,这并不是我想要的,因为我希望它过滤掉/不显示顶级文件夹中的文件。我只想获得目录(包括 .*
目录)的摘要,而不是单个文件的混乱。我想我需要修改 ls
但不知道如何修改?
更好的方法是执行上述操作,并且另外显示一行仅显示此文件夹顶层中所有文件的总大小,如果可能的话,与所有子文件夹总数一起显示?
(大部分)从评论中重复:
您可以只在 ls 中使用 -F,然后过滤掉不以 / 结尾的行。例如 du -hsc $(ls -AF) | sort -h | sed '\@/$@!d'
这将删除总数,您可以通过以下方式轻松取回:
du -hsc $(ls -AF) | sort -h | sed '$p; \@/$@!d'
不解析 ls
的输出,这是一个糟糕的选择:
printf %s\n .[^.]*/ ..[^.]/ ..[^.]*/ */ |
xargs du -hsc 2>/dev/null |
sort -k1h
如果您需要支持包含换行符或特殊字符的目录名称:
printf %s\0 .[^.]*/ ..[^.]/ ..[^.]*/ */ |
xargs -0 du -hsc0 2>/dev/null |
sort -zk1h |
xargs -0l
我不明白你为什么要在这里使用 ls
。一个简单的
old_setting=$(shopt -p dotglob)
shopt -s dotglob
du -hsc */
eval $old_setting
就足够了。终止斜线很重要,因为这指示 bash 仅创建目录名称,并且您需要设置 dotglob 以包含点目录(.
和 ..
).在我的代码中,我还小心地保存了旧的 dotglob 设置并在其他情况下恢复它。只有当您的代码是大型脚本的一部分时才需要这样做,其中某些部分可能依赖于 dotglob.
的默认值
旁注:一种完全不同的方法是为您的脚本选择 zsh 而不是 bash。在 zsh 中,您不需要更改任何选项,而只需在模式本身中表达您想要 glob 点目录:
du -hsc */(D) # This is for zsh only!
关于这个的话题很长,我已经阅读了我能找到的所有内容,但他们没有回答我的问题。
以下是我能找到的在文件夹中获得格式良好的 du
列表的最佳方法:
du -hsc $(ls -A) | sort -h
但是,这并不是我想要的,因为我希望它过滤掉/不显示顶级文件夹中的文件。我只想获得目录(包括 .*
目录)的摘要,而不是单个文件的混乱。我想我需要修改 ls
但不知道如何修改?
更好的方法是执行上述操作,并且另外显示一行仅显示此文件夹顶层中所有文件的总大小,如果可能的话,与所有子文件夹总数一起显示?
(大部分)从评论中重复:
您可以只在 ls 中使用 -F,然后过滤掉不以 / 结尾的行。例如 du -hsc $(ls -AF) | sort -h | sed '\@/$@!d'
这将删除总数,您可以通过以下方式轻松取回:
du -hsc $(ls -AF) | sort -h | sed '$p; \@/$@!d'
不解析 ls
的输出,这是一个糟糕的选择:
printf %s\n .[^.]*/ ..[^.]/ ..[^.]*/ */ |
xargs du -hsc 2>/dev/null |
sort -k1h
如果您需要支持包含换行符或特殊字符的目录名称:
printf %s\0 .[^.]*/ ..[^.]/ ..[^.]*/ */ |
xargs -0 du -hsc0 2>/dev/null |
sort -zk1h |
xargs -0l
我不明白你为什么要在这里使用 ls
。一个简单的
old_setting=$(shopt -p dotglob)
shopt -s dotglob
du -hsc */
eval $old_setting
就足够了。终止斜线很重要,因为这指示 bash 仅创建目录名称,并且您需要设置 dotglob 以包含点目录(.
和 ..
).在我的代码中,我还小心地保存了旧的 dotglob 设置并在其他情况下恢复它。只有当您的代码是大型脚本的一部分时才需要这样做,其中某些部分可能依赖于 dotglob.
旁注:一种完全不同的方法是为您的脚本选择 zsh 而不是 bash。在 zsh 中,您不需要更改任何选项,而只需在模式本身中表达您想要 glob 点目录:
du -hsc */(D) # This is for zsh only!