用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
因为它显示了du
和ls
的输出(按照这个顺序):
$ 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名称。
双重使用( --
)表示命令行选项的结尾是du
和ls
。 如果没有这些, duls -l
会混淆du
, du
任何选项都不会迷惑ls
(两个公用事业中存在的选项可能并不意味着同样的东西,而且会非常混乱)。
du
之后的cut
只是删除了du -hs
输出的第一列(大小)。
我决定把du
输出在左边,否则我将不得不pipe理一个不稳定的右列(由于文件名长度不同)。
该命令不会接受命令行标志。
这已经在bash
和ksh93
进行了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”