我发现在Bash中没有容易获得目录大小的方法吗?
我希望当我键入时ls -<some options>
,它可以递归列出目录文件大小的所有总和,并同时列出文件并按大小顺序排序。
那可能吗?
du
就是答案。
du
命令估计文件空间使用情况,因此,如果要获取确切的大小,则无法使用它。
du
(至少是GNU coreutils版本),您可能可以选择提供信息。
我发现在Bash中没有容易获得目录大小的方法吗?
我希望当我键入时ls -<some options>
,它可以递归列出目录文件大小的所有总和,并同时列出文件并按大小顺序排序。
那可能吗?
du
就是答案。
du
命令估计文件空间使用情况,因此,如果要获取确切的大小,则无法使用它。
du
(至少是GNU coreutils版本),您可能可以选择提供信息。
Answers:
只需导航到目录并运行以下命令:
du -a --max-depth=1 | sort -n
或添加-h以获得人类可读的大小,并添加-r首先打印较大的目录/文件。
du -a -h --max-depth=1 | sort -hr
du -h
也需要sort -h
确保,说981M
之前1.3G
;与sort -n
只有数字将予以考虑,他们会是南辕北辙。
-a
和使用,--all
而不是--max-depth=1
像这样du -a -h --all | sort -h
sort -h
仅适用于GNU的版本/ Linux的,没有运气与BSD / OS X.
du -s -- * | sort -n
(这不会显示隐藏的(.dotfiles)文件)
使用du -sm
甲基溴单位等我总是使用
du -smc -- * | sort -n
因为总行(-c
)出于显而易见的原因最终将排在底部:)
du --max-depth=1|sort -n
或也find . -mindepth 1 -maxdepth 1|xargs du -s|sort -n
包括点文件。
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -n
如果找到的某些路径可能包含空格。
sudo du -smch * | sort -h | tail
du -h --max-depth=0 * | sort -hr
3,5M asdf.6000.gz
3,4M asdf.4000.gz
3,2M asdf.2000.gz
2,5M xyz.PT.gz
136K xyz.6000.gz
116K xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K desc.common.tcl
8,0K wer.2000p.gz
8,0K wer.2000.gz
4,0K ttree.3
du
显示“磁盘使用情况”h
用于“人类可读”(无论是在排序上还是在du上)max-depth=0
表示du
将不会显示子文件夹的大小(如果要显示每个子文件夹,子文件夹,...文件夹中每个文件的所有大小,请删除该文件夹)r
用于“反向”(最大的文件在前)当我遇到这个问题时,我想清理我的文件系统。命令行工具ncdu
更适合此任务。
在Ubuntu上安装:
$ sudo apt-get install ncdu
用法:
只需ncdu [path]
在命令行中输入。在分析路径几秒钟后,您将看到类似以下内容:
$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
. 96,1 GiB [##########] /home
. 17,7 GiB [# ] /usr
. 4,5 GiB [ ] /var
1,1 GiB [ ] /lib
732,1 MiB [ ] /opt
. 275,6 MiB [ ] /boot
198,0 MiB [ ] /storage
. 153,5 MiB [ ] /run
. 16,6 MiB [ ] /etc
13,5 MiB [ ] /bin
11,3 MiB [ ] /sbin
. 8,8 MiB [ ] /tmp
. 2,2 MiB [ ] /dev
! 16,0 KiB [ ] /lost+found
8,0 KiB [ ] /media
8,0 KiB [ ] /snap
4,0 KiB [ ] /lib64
e 4,0 KiB [ ] /srv
! 4,0 KiB [ ] /root
e 4,0 KiB [ ] /mnt
e 4,0 KiB [ ] /cdrom
. 0,0 B [ ] /proc
. 0,0 B [ ] /sys
@ 0,0 B [ ] initrd.img.old
@ 0,0 B [ ] initrd.img
@ 0,0 B [ ] vmlinuz.old
@ 0,0 B [ ] vmlinuz
使用删除当前突出显示的元素d,使用CTRL+ 退出c
我想我可能已经想通了。这将给出所有文件和所有目录的排序列表,并按文件大小和目录中内容的大小排序。
(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
du
不是一种选择,它只会给您大概的结果。
[增强版本]
这将比下面的初始版本更快,更精确,并且将输出当前目录的所有文件大小的总和:
echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
stat -c %s
文件上的命令将返回其大小(以字节为单位)。tr
这里的命令用于克服xargs
命令限制(显然用管道xargs
将结果拆分到更多行上,这破坏了我命令的逻辑)。因此tr
,请注意用+
(加号)替换换行符。sed
唯一的目标是+
从结果字符串中删除最后一个符号,以避免bc
像通常那样进行数学运算的final (基本计算器)命令发出抱怨。
性能:我在多个目录上进行了测试,文件顶部超过150.000个(我的fedora 15盒的当前文件数),我相信这是一个惊人的结果:
# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700
real 2m19.164s
user 0m2.039s
sys 0m14.850s
万一您想与该du -sb /
命令进行比较,它将以字节为单位输出估计的磁盘使用情况(-b
可选)
# du -sb /
12684646920 /
如我所料,它比命令计算要大一些,因为该du
实用程序返回每个文件的已分配空间,而不是实际消耗的空间。
[初始版本]如果需要知道文件夹的确切总大小,
则不能使用du
command,因为(根据手册页的引用)du
估计文件空间的使用情况。因此,这将导致您得出错误的结果,即近似值(可能接近总和大小,但很可能大于您要寻找的实际大小)。
我认为可能有不同的方式回答您的问题,但这是我的:
ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc
它会找到所有文件。目录(使用您喜欢的目录更改。),还包括隐藏文件,并且(使用xargs
)将它们的名称输出在一行中,然后使用生成详细列表ls -l
。这个(有时)巨大的输出通过管道传递给cut命令,并且仅采用第五个字段(-f5
),即以字节为单位的文件大小,并再次通过管道对接,xargs
从而再次产生一行由空格分隔的大小。现在使用sed魔术,用加号(+
)替换每个空格,最后bc
(基本计算器)进行数学运算。
它可能需要额外的调整,并且您可能有ls
命令抱怨参数列表太长。
您可以使用以下按du -h |大小列出文件。-hr | 更多或du -h --max-depth = 0 * | -hr | 更多