用ls列出目录及其总大小

是否有可能在Unix中使用ls来列出子目录及其所有内容的总大小,而不是像通常的4K(我假设)只是目录文件本身? IE

 total 12K drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk 

淘完手册后,我就空了。

尝试像这样:

 du -sh * du --summary --human-readable * 

说明:

du :圣人

-s :显示每个指定文件的摘要。 (相当于-d 0

-h :“可读的”输出。 使用单位后缀:字节, K ibibyte(KiB),Mbibyte(MiB), G ibibyte(GiB), T ebibyte(TiB)和Pbbbyte(PiB)。 (BASE2)

du -sk * | sort -n du -sk * | sort -n将按大小对文件夹进行sorting。 希望清空空间时很有帮助

 du -sh * | sort -h 

这将以可读的格式显示。

你想要的命令是'du -sk'du =“磁盘使用情况”

-k标志以千字节为单位给出输出,而不是磁盘扇区的默认值(512字节块)。

-s标志只会列出顶层目录(即当前目录,默认情况下,或命令行中指定的目录)中的内容。 du在这方面与ls有相反的行为,这很奇怪。 默认情况下,du会recursion地给你每个子目录的磁盘使用情况。 相比之下,ls只会给出指定目录中的列表文件。 (ls -R给你recursion行为。)

要以ls -lh格式显示,请使用:

 (du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }' 

Awk代码解释:

 if($1 == "total") { // Set X when start of ls is detected X = 1 } else if (!X) { // Until X is set, collect the sizes from `du` SIZES[$2] = $1 } else { // Replace the size on current current line (with alignment) sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0 } 

示例输出:

 drwxr-xr-x 2 root root 4.0K Feb 12 16:43 cgi-bin drwxrws--- 6 root www 20M Feb 18 11:07 document_root drwxr-xr-x 3 root root 1.3M Feb 18 00:18 icons drwxrwsr-x 2 localusr www 8.0K Dec 27 01:23 passwd 

以可读格式列出当前目录中最大的目录:

du -sh * | sort -hr

限制行数的更好的方法是

du -sh * | sort -hr | head -n10

在哪里可以增加-n标志的后缀来限制列出的行数

样品:

 [~]$ du -sh * | sort -hr 48M app 11M lib 6.7M Vendor 1.1M composer.phar 488K phpcs.phar 488K phpcbf.phar 72K doc 16K nbproject 8.0K composer.lock 4.0K README.md 

这使得阅读更方便:)

我总是使用du -sk-k标志显示文件大小以千字节为单位)。

 du -h --max-depth=1 . | sort -n -r 

du -sch *在同一个目录下。

把这个shell函数声明放到你的shell初始化脚本中:

 function duls { paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" ) } 

我把它称为duls因为它显示了duls的输出(按照这个顺序):

 $ duls 210M drwxr-xr-x 21 kk staff 714 Jun 15 09:32 . $ duls * 36K -rw-r--r-- 1 kk staff 35147 Jun 9 16:03 COPYING 8.0K -rw-r--r-- 1 kk staff 6962 Jun 9 16:03 INSTALL 28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile 4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am 24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in 4.0K -rw-r--r-- 1 kk staff 1689 Jun 9 16:03 README 120K -rw-r--r-- 1 kk staff 121585 Jun 10 13:26 aclocal.m4 684K drwxr-xr-x 7 kk staff 238 Jun 10 13:26 autom4te.cache 128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build 60K -rw-r--r-- 1 kk staff 60083 Jun 10 13:26 config.log 36K -rwxr-xr-x 1 kk staff 34716 Jun 10 13:26 config.status 264K -rwxr-xr-x 1 kk staff 266637 Jun 10 13:26 configure 8.0K -rw-r--r-- 1 kk staff 4280 Jun 10 13:25 configure.ac 7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc 2.3M drwxr-xr-x 28 kk staff 952 Jun 10 13:26 examples 6.2M -rw-r--r-- 1 kk staff 6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz 11M drwxr-xr-x 42 kk staff 1428 Jun 10 13:26 src $ duls doc 7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc $ duls [bM]* 28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile 4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am 24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in 128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build 

说明:

paste实用程序根据您提供的规范从其input创build列。 给定两个input文件,它将它们并排放置,并使用选项卡作为分隔符。

我们给它du -hs -- "$@" | cut -f1的输出du -hs -- "$@" | cut -f1 du -hs -- "$@" | cut -f1作为第一个文件(真正的inputstream)和ls -ld -- "$@"的输出作为第二个文件。

在函数中, "$@"将计算到所有命令行参数的列表中,每个参数都用双引号括起来。 因此,它会理解通过空格等字符和path名称。

双重使用( -- )表示命令行选项的结尾是duls 。 如果没有这些, duls -l会混淆dudu任何选项都不会迷惑ls (两个公用事业中存在的选项可能并不意味着同样的东西,而且会非常混乱)。

du之后的cut只是删除了du -hs输出的第一列(大小)。

我决定把du输出在左边,否则我将不得不pipe理一个不稳定的右列(由于文件名长度不同)。

该命令不会接受命令行标志。

这已经在bashksh93进行了testing。 它不会用/bin/sh

看看du命令

这些都是很好的build议,但我使用的是:

 du -ksh * | sort -n -r 

-ksh确保文件和文件夹以可读格式列出,并且以兆字节,千字节等等为单位列出。然后,按数字顺序对它们进行sorting,并反转sorting,以便将较大的排在第一位。

这个命令唯一的缺点就是电脑不知道Gigabyte比Megabyte大,所以只能按数字sorting,而且你会经常发现像这样的列表:

 120K 12M 4G 

只要小心看看单位。

这个命令也适用于Mac(而sort -h不是)。

 du -S 

有另一个有用的select: -S, --separate-dirs不包括子目录的大小 – 在某些场合方便。

示例1 – 显示目录中的文件大小:

 du -Sh * 3,1G 10/CR2 280M 10 

示例2 – 显示目录中的文件大小和子目录:

 du -h * 3,1G 10/CR2 3,4G 10 

du -sm * | sort -nr

按大小输出

这是我喜欢的一个

更新 :我不喜欢以前的一个,因为它没有显示当前目录中的文件,它只列出目录。

ubuntu上的/var输出示例:

sudo du -hDaxd1 /var | sort -h | tail -n10

 4.0K /var/lock 4.0K /var/run 4.0K /var/www 12K /var/spool 3.7M /var/backups 33M /var/log 45M /var/webmin 231M /var/cache 1.4G /var/lib 1.7G /var 

只是一个警告,如果你想比较文件的大小。 du根据文件系统,块大小,产生不同的结果。

可能会发生文件大小不同的情况,例如比较本地硬盘上的相同目录和USB大容量存储设备。 我使用下面的脚本,包括ls来总结目录的大小。 以字节为单位的结果考虑了所有子目录。

 echo "[GetFileSize.sh] target directory: \"$1\"" iRetValue=0 uiLength=$(expr length "$1") if [ $uiLength -lt 2 ]; then echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!" iRetValue=-1 else echo "[GetFileSize.sh] computing size of files..." # use ls to compute total size of all files - skip directories as they may # show different sizes, depending on block size of target disk / file system uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}') uiLength=$(expr length "$uiTotalSize") if [ $uiLength -lt 1 ]; then uiTotalSize=0 fi echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\"" fi exit "$iRetValue" 

以recursion方式显示当前目录的文件和子目录大小:

 du -h . 

要显示相同的大小信息,recursion地打印子目录(可能是一个巨大的列表),只需使用–max-depth选项:

 du -h --max-depth=1 . 

有一段时间,我使用Nautilus(在RHEL 6.0的Gnome桌面上)来删除我的home文件夹中的文件,而不是在bash中使用rm命令。 因此,总的大小显示

 du -sh 

与我使用的每个子目录的磁盘使用量的总和不匹配

 du -sh * 

我花了一段时间才意识到Nautilus将删除的文件发送到其“垃圾箱”文件夹,并且该文件夹未在du -sh *命令中列出。 所以,只是想分享一下,以防有人遇到同样的问题。

嗯,最好的方法是使用这个命令:

 du -h -x / | sort -hr >> /home/log_size.txt 

然后,您将能够在所有服务器上获取所有大小的文件夹。 容易帮助你find最大的尺寸。

我遇到了类似于Martin Wilde所描述的问题,在我的情况下,在使用rsync进行镜像后,比较两个不同服务器上的相同目录。

我不是用脚本,而是在du添加了-b标志,它以字节为单位计算大小,并且据我所知可以确定消除了两台服务器之间的差异。 您仍然可以使用-s -h来获得可理解的输出。

键入“ls -ltrh / path_to_directory”