有没有办法列出目录的内容,包括带有文件计数和累积大小的子目录?
我想看看:
- 目录数量
- 子目录数量
- 文件数量
- 累积大小
答案1
如果我理解正确的话,这会给你想要的:
find /path/to/target -type d | while IFS= read -r dir; do
echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)"
echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
echo -e "\tfiles: $(find "$dir" -type f | wc -l )";
done | tac
例如,如果您运行它/boot
,您会得到如下输出:
/boot/burg/themes/sora_extended size: 8.0K subdirs: 0 files: 1
/boot/burg/themes/radiance/images size: 196K subdirs: 0 files: 48
/boot/burg/themes/radiance size: 772K subdirs: 1 files: 53
/boot/burg/themes/winter size: 808K subdirs: 0 files: 35
/boot/burg/themes/icons size: 712K subdirs: 0 files: 76
/boot/burg/themes size: 8.9M subdirs: 26 files: 440
/boot/burg/fonts size: 7.1M subdirs: 0 files: 74
/boot/burg size: 20M subdirs: 29 files: 733
/boot/grub/locale size: 652K subdirs: 0 files: 17
/boot/grub size: 4.6M subdirs: 1 files: 224
/boot/extlinux/themes/debian-wheezy/extlinux size: 732K subdirs: 0 files: 11
/boot/extlinux/themes/debian-wheezy size: 1.5M subdirs: 1 files: 22
/boot/extlinux/themes size: 1.5M subdirs: 2 files: 22
/boot/extlinux size: 1.6M subdirs: 3 files: 28
/boot/ size: 122M subdirs: 36 files: 1004
为了轻松访问此命令,您可以将其转换为函数。将这些行添加到 shell 的初始化文件中(~/.bashrc
对于 bash):
dirsize(){
find "$1" -type d | while IFS= read -r dir; do
echo -ne "$dir\tsize: $(du -sh "$dir"| cut -f 1)"
echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l )";
done | tac
}
您现在可以将其运行为dirsize /path/
.
解释
上面的函数有5个主要部分:
find /path/to/target -type d | while IFS= read -r dir; do ... ; done
:这将找到下面的所有目录,并通过将变量设置为其名称来/path/to/target
处理每个目录。dir
确保IFS=
这不会在名称中包含空格的目录上中断。echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)"
:这使用命令du
来获取目录的大小并cut
仅打印 的第一个字段du
。echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
:此 find 命令查找$dir
.确保type -d
我们只查找目录,不查找文件,并-mindepth
确保我们不计算当前目录.
。echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l)";
:这会查找以下文件 (-type f
)直接地(-maxdepth 1
) 在下面$dir
。它不会计算$d
.| tac
: 终于全部通过了tac
这只是颠倒了行的打印顺序。这意味着目标目录的总大小将显示在最后一行。如果这不是您想要的,只需删除| tac
.