Linux 如何在Bash中列出每个文件和目录的大小并按大小降序排序?
我发现在Bash中没有一种容易获得目录大小的方法 我希望当我键入Linux 如何在Bash中列出每个文件和目录的大小并按大小降序排序?,linux,file,bash,Linux,File,Bash,我发现在Bash中没有一种容易获得目录大小的方法 我希望当我键入ls-时,它可以同时递归地列出目录和文件的所有文件大小之和,并按大小顺序排序 这可能吗?ls-S按大小排序。然后,为了也显示大小,ls-ls给出一个长(-l),按大小排序(-S)显示。我通常也会添加-h,以便于阅读,因此,ls-lhS du -s -- * | sort -n (这不会显示隐藏的(.dotfiles)文件) 使用du-sm表示Mb单位等。我总是使用 du -smc -- * | sort -n 因为明显的原因,总
ls-
时,它可以同时递归地列出目录和文件的所有文件大小之和,并按大小顺序排序
这可能吗?
ls-S
按大小排序。然后,为了也显示大小,ls-ls
给出一个长(-l
),按大小排序(-S
)显示。我通常也会添加-h
,以便于阅读,因此,ls-lhS
du -s -- * | sort -n
(这不会显示隐藏的(.dotfiles)文件)
使用du-sm
表示Mb单位等。我总是使用
du -smc -- * | sort -n
因为明显的原因,总行(-c
)将位于底部:)
附言:
- 请参阅有关处理dot文件的注释
- 我经常使用例如“du-smc/home/| sort-n | tail”来了解大件的确切位置
- 我想我可能已经知道你想做什么了。这将给出所有文件和所有目录的排序列表,按文件大小和目录中内容的大小排序
(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
[增强版]这将比下面的初始版本更快、更精确,并将输出当前目录中所有文件大小的总和:
echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
文件上的stat-c%s
命令将返回其大小(以字节为单位)。这里的tr
命令用于克服xargs
命令的限制(显然,管道到xargs
会在更多行上分割结果,破坏我命令的逻辑)。因此,tr
负责将换行符替换为+
(加号)sed
的唯一目标是从结果字符串中删除最后一个+
符号,以避免最后一个bc
(基本计算器)命令像往常一样进行计算时出现抱怨
性能:我在几个目录和超过150000个文件(我的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
实用程序返回每个文件的分配空间,而不是实际消耗的空间
[初始版本]如果需要知道文件夹的确切总大小,则不能使用
du
命令,因为(根据手册页引用)du
估计文件空间使用情况。因此,它将导致错误的结果,近似值(可能接近总和大小,但很可能大于您正在寻找的实际大小)
我想可能有不同的方法来回答你的问题,但这是我的:
ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc
它会在下查找所有文件。目录(更改。使用您喜欢的任何目录),还包括隐藏文件(使用xargs
)并在一行中输出它们的名称,然后使用ls-l
生成详细列表。这个(有时)巨大的输出通过管道传输到cut命令,只有第五个字段(-f5
)被获取,这是以字节为单位的文件大小,然后再次通过管道传输到xargs
,这再次产生一行由空格分隔的大小。现在进行一个sed魔术,用加号(+
)替换每个空格,最后由bc
(基本计算器)进行计算
它可能需要额外的调优,并且您可能有
ls
命令抱怨参数列表太长。另一个简单的解决方案
$ for entry in $(ls); do du -s "$entry"; done | sort -n
结果看起来像
2900 tmp
6781 boot
8428 bin
24932 lib64
34436 sbin
90084 var
106676 etc
125216 lib
3313136 usr
4828700 opt
将“du-s”更改为“du-sh”将显示人类可读的大小,但我们无法使用此方法进行排序。只需导航到目录并运行以下命令:
du -a --max-depth=1 | sort -n
或者添加-h表示人类可读的大小,添加-r表示首先打印更大的目录/文件
du -a -h --max-depth=1 | sort -hr
命令
输出
解释
显示“磁盘使用情况”du
表示“人类可读”(排序和du)h
表示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退出。您可以使用下面的按大小列出文件 du-h | sort-hr |更多 或
du-h--max depth=0*| sort-hr | more我倾向于以一种简单的方式使用du
du -sh */ | sort -n
这使我了解了哪些目录占用的空间最多。然后我可以在以后运行更精确的搜索。显然--max depth
选项不在Mac OS X版本的du
命令中。您可以使用以下选项
du-h-d1 | sort-n
简单快速:
find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n
*需要。啊,对不起,你的帖子里不清楚。你想要
du
,好像有人把它贴出来了@sehe:取决于你对real的定义——它显示了目录用来存储自身的空间量。(这不仅仅是增加子条目的大小。)它不是一个随机数,也不总是4KB。你所说的目录的“大小”到底是什么意思?它下的文件数(递归还是非递归)?其下文件大小的总和(递归还是非递归)?目录本身的磁盘大小?(目录被实现为包含文件的特殊文件
$ 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
du -sh */ | sort -n
find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n