使用ls列出目录及其总大小

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

total 12Kdrwxrwxr-x  6 *** *** 4.0K 2009-06-19 10:10 branchesdrwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tagsdrwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk

在翻遍了手册之后,我一无所获。

1064966 次浏览

请查看du命令

试着这样做:

du -sh *

简写版:

du --summarize --human-readable *

解释:

du: Disk Usage

-s:显示每个指定文件的摘要。(相当于第一条)

-h:“人类可读”输出。使用单位后缀:Byte, Kibibyte (KiB), ebibyte (MiB), Gibibyte (GiB), Tebibyte (TiB)和Pebibyte (PiB)。(BASE2)

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

您需要的命令是'du -sk' du = "磁盘使用率"

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

-s标志将只列出顶级目录(即默认情况下的当前目录或命令行上指定的目录)中的内容。奇怪的是,在这方面du和ls表现相反。默认情况下,du将递归地提供每个子目录的磁盘使用情况。相反,ls只会给出指定目录下的列表文件。(ls -R提供递归行为。)

du -sk * | sort -n将按大小对文件夹进行排序。当你想要清理空间时很有帮助。

或者在人类可读模式下使用du -sh * | sort -h

du -sh * | sort -h

这将以人类可读的格式显示。

使用实例递归显示当前目录的文件和子目录大小。

du -h .

要显示相同大小的信息没有,递归打印它们的子目录(可能是一个巨大的列表),只需使用——max-depth选项:

du -h --max-depth=1 .

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

du -ksh * | sort -n -r

-ksh确保文件和文件夹以人类可读的格式列出,并以兆字节、千字节等为单位。然后你对它们进行数值排序,然后反转排序,让大的放在前面。

这个命令唯一的缺点是,计算机不知道千兆字节比兆字节大,所以它只会按数字排序,你经常会发现这样的列表:

120K12M4G

只是要仔细观察单位。

该命令也适用于Mac(而sort -h则不能)。

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

Du -sch *在同一目录下。

要以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 detectedX = 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-bindrwxrws--- 6 root     www  20M     Feb 18 11:07 document_rootdrwxr-xr-x 3 root     root 1.3M    Feb 18 00:18 iconsdrwxrwsr-x 2 localusr www  8.0K    Dec 27 01:23 passwd

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

# 0

一个更好的限制行数的方法是

# 0

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

示例:

[~]$ du -sh * | sort -hr48M app11M lib6.7M    Vendor1.1M    composer.phar488K    phpcs.phar488K    phpcbf.phar72K doc16K nbproject8.0K    composer.lock4.0K    README.md

这样读起来更方便:)

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

du -sh

每个子目录的磁盘使用量之和不匹配,当我使用

du -sh *

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

du -S

有另一个有用的选项:-S, --separate-dirs告诉不包括子目录的大小-在某些情况下很方便。

示例1 -显示目录中的文件大小只有:

du -Sh  *3,1G    10/CR2280M    10

例2 -显示了目录下的文件大小和子目录:

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

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

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

echo "[GetFileSize.sh] target directory: \"$1\""
iRetValue=0
uiLength=$(expr length "$1")if [ $uiLength -lt 2 ]; thenecho "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"iRetValue=-1elseecho "[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 systemuiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')uiLength=$(expr length "$uiTotalSize")if [ $uiLength -lt 1 ]; thenuiTotalSize=0fiecho -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""
fi
exit "$iRetValue"

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

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

然后你就可以在你的服务器上获得所有大小的文件夹。轻松帮助您找到最大的尺寸。

我遇到了一个类似于Martin Wilde描述的问题,在我的例子中,在使用rsync镜像后比较两个不同服务器上的相同目录。

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

Du -sm * | sort -nr

按大小输出

输入“ls -ltrh /path_to_directory”

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

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

我称它为duls,因为它显示了duls的输出(按此顺序):

$ duls210M    drwxr-xr-x  21 kk  staff  714 Jun 15 09:32 .
$ duls *36K    -rw-r--r--   1 kk  staff    35147 Jun  9 16:03 COPYING8.0K    -rw-r--r--   1 kk  staff     6962 Jun  9 16:03 INSTALL28K    -rw-r--r--   1 kk  staff    24816 Jun 10 13:26 Makefile4.0K    -rw-r--r--   1 kk  staff       75 Jun  9 16:03 Makefile.am24K    -rw-r--r--   1 kk  staff    24473 Jun 10 13:26 Makefile.in4.0K    -rw-r--r--   1 kk  staff     1689 Jun  9 16:03 README120K    -rw-r--r--   1 kk  staff   121585 Jun 10 13:26 aclocal.m4684K    drwxr-xr-x   7 kk  staff      238 Jun 10 13:26 autom4te.cache128K    drwxr-xr-x   8 kk  staff      272 Jun  9 16:03 build60K    -rw-r--r--   1 kk  staff    60083 Jun 10 13:26 config.log36K    -rwxr-xr-x   1 kk  staff    34716 Jun 10 13:26 config.status264K    -rwxr-xr-x   1 kk  staff   266637 Jun 10 13:26 configure8.0K    -rw-r--r--   1 kk  staff     4280 Jun 10 13:25 configure.ac7.0M    drwxr-xr-x   8 kk  staff      272 Jun 10 13:26 doc2.3M    drwxr-xr-x  28 kk  staff      952 Jun 10 13:26 examples6.2M    -rw-r--r--   1 kk  staff  6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz11M    drwxr-xr-x  42 kk  staff     1428 Jun 10 13:26 src
$ duls doc7.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 Makefile4.0K    -rw-r--r--  1 kk  staff     75 Jun  9 16:03 Makefile.am24K    -rw-r--r--  1 kk  staff  24473 Jun 10 13:26 Makefile.in128K    drwxr-xr-x  8 kk  staff    272 Jun  9 16:03 build

解释:

paste实用程序根据您给它的规范从它的输入中创建列。给定两个输入文件,它将它们并排放置,并使用制表符作为分隔符。

我们将du -hs -- "$@" | cut -f1的输出作为第一个文件(实际上是输入流),将ls -ld -- "$@"的输出作为第二个文件。

在函数中,"$@"将计算为所有命令行参数的列表,每个参数都用双引号括起来。因此,它将理解通配符和带有空格的路径名等。

两个减号(--)表示命令行选项duls的结束。如果没有这些,说duls -l会混淆du,而ls没有的du选项也会混淆ls(并且两个实用程序中存在的选项可能意味着不同的事情,这将是相当混乱的)。

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

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

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

这已经在bashksh93中进行了测试。这对第二条行不通。

这是我喜欢的

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

ubuntu上/var的输出示例:

# 0

4.0K    /var/lock4.0K    /var/run4.0K    /var/www12K     /var/spool3.7M    /var/backups33M     /var/log45M     /var/webmin231M    /var/cache1.4G    /var/lib1.7G    /var

在初始化脚本中放置。bashrc…根据需要调整def。

duh() {# shows disk utilization for a path and depth levelpath="${1:-$PWD}"level="${2:-0}"du "$path" -h --max-depth="$level"}

如果你想要更多地控制你想要列出目录的size,你可以使用threshold(-t)开关,如下所示:

$ du -ht 1000000000 | sort --reverse

du - disk usage
h -人类可读格式
t -阈值大小

在这里,我们想要列出大小大于1GB的所有目录。

$ du -ht 1G | sort --reverse

# 0:

wiki中描述单位如下:

K, M, G, T, p, E, Z, Y(1024的幂)或
KB, MB, GB, TB, PB, EB, ZB, YB(1000的幂).

0 (ncurses du)

这个很棒的CLI实用程序允许您轻松地交互式地查找大文件和目录(递归总大小)。

例如,在一个著名的开源项目的根目录中,我们执行:

sudo apt install ncduncdu

结果是:

enter image description here

然后,我在键盘上向下输入,进入/drivers文件夹,我看到:

enter image description here

ncdu只在整个树启动时递归地计算文件大小,因此它是高效的。这样,当您在子目录内移动时,就不必重新计算大小,因为您试图确定磁盘占用是什么。

“总磁盘使用量”;vs“表观尺寸”;类似于du,我已经解释过了:为什么' du '的输出和' du -b '的输出经常如此不同?

项目主页:https://dev.yorhel.nl/ncdu

相关问题:

  • https://unix.stackexchange.com/questions/67806/how-to-recursively-find-the-amount-stored-in-directory/67808 < a href = " https://unix.stackexchange.com/questions/67806/how-to-recursively-find-the-amount-stored-in-directory/67808 " > < / >
  • https://unix.stackexchange.com/questions/125429/tracking-down-where-disk-space-has-gone-on-linux < a href = " https://unix.stackexchange.com/questions/125429/tracking-down-where-disk-space-has-gone-on-linux " > < / >
  • https://askubuntu.com/questions/57603/how-to-list-recursive-file-sizes-of-files-and-directories-in-a-directory < a href = " https://askubuntu.com/questions/57603/how-to-list-recursive-file-sizes-of-files-and-directories-in-a-directory " > < / >
  • < a href = " https://serverfault.com/questions/43296/how——————发现————文件——带-的- 80 - - -空间- - - linux - webserve”> https://serverfault.com/questions/43296/how——————发现————文件——带-的- 80 - - -空间- - - linux - webserve < / >

在Ubuntu 16.04中测试。

Ubuntu列表根目录

你可能想要:

ncdu --exclude-kernfs -x /

地点:

  • -x停止跨文件系统障碍
  • --exclude-kernfs跳过像/sys这样的特殊文件系统

MacOS 10.15.5 list root

为了正确地列出系统上的根/,我还需要--exclude-firmlinks,例如:

brew install ncducd /ncdu --exclude-firmlinks

否则,它似乎进入了一些链接无限循环,可能是由于:https://www.swiftforensics.com/2019/10/macos-1015-volumes-firmlink-magic.html

我们为了爱而学习的东西。

ncdu非交互式使用

ncdu的另一个很酷的特性是,您可以先以JSON格式转储大小,然后再重用它们。

例如,要生成文件,运行:

ncdu -o ncdu.json

然后用互动的方式检查它:

ncdu -f ncdu.json

如果您正在处理一个非常大而缓慢的文件系统,如NFS,这是非常有用的。

通过这种方式,您可以首先只导出一次,这可能需要几个小时,然后浏览文件、退出、再次浏览等等。

输出格式只是JSON,所以很容易在其他程序中重用它,例如:

ncdu -o -  | python -m json.tool | less

揭示了一个简单的目录树数据结构:

[1,0,{"progname": "ncdu","progver": "1.12","timestamp": 1562151680},[{"asize": 4096,"dev": 2065,"dsize": 4096,"ino": 9838037,"name": "/work/linux-kernel-module-cheat/submodules/linux"},{"asize": 1513,"dsize": 4096,"ino": 9856660,"name": "Kbuild"},[{"asize": 4096,"dsize": 4096,"ino": 10101519,"name": "net"},[{"asize": 4096,"dsize": 4096,"ino": 11417591,"name": "l2tp"},{"asize": 48173,"dsize": 49152,"ino": 11418744,"name": "l2tp_core.c"},

在Ubuntu 18.04中测试。

从ls中只检索以字节为单位的大小。

ls -ltr | head -n1 | cut -d' ' -f2

这里需要注意的是,du给出的是磁盘使用率。不同的机器可以使用不同的块大小,因此在一台机器上一个块可以是4096字节,而另一台机器可以包含2048字节的块大小。如果我在一台使用4096字节块的机器中放入10个1字节文件,在一台使用2048字节块的机器中放入10个1字节文件,du -h将分别报告~40k和~20k。

如果你想知道一个目录中所有文件的大小,对于每个目录,你可以这样做:

for x in ./*;doif [[ -f "$x" ]]; thenls -al "$x"fidone | awk '{print $6}' | awk '{s+=$1}END{print s}'

这将为您提供目录中所有文件的总大小。

find . -maxdepth 1 -exec du --apparent-size --max-depth=0 --null '{}' ';' |\sort -k1 -nr --zero-terminated |\cut -f2 --zero-terminated |\xargs --null -n 1 du -h --apparent-size --max-depth=0

特点:

  • 由于Linux文件名可以有换行符或空格,所以我们使用空字符来分隔文件/目录名。
  • 我们根据文件/目录的大小对它们进行排序。
  • 我们使用--apparent-sizedu来获得类似于ls的行为。

目录中# 0,# 1的文件夹和文件(后代顺序,根据大小):

du -skh * | sort -hr

包括隐藏文件:

du -skh .??* * | sort -hr

解释:

  • 该命令首先显示较大的文件/文件夹。
  • 它适用于隐藏(以点开始)的文件/文件夹。
  • 它显示了人类可读的大小(GB、MB等)。

请注意。其他答案包含大部分这些选项,但分散在不同的答案,这里没有探索如何轻松包含隐藏的文件/文件夹。

# 0 # 1

0       bin4.0K    boot0       dev9.0M    etc6.5M    home824K    init0       lib0       lib320       lib640       libx3216K     lost+found4.0K    media4.0K    mnt4.0K    opt0       proc61M     root36K     run0       sbin4.0K    srv0       sys4.0K    tmp2.2G    usr4.9G    var