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


825

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

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

搜寻手册页后,我空白了。


4
您要改用du -s
枪声

21
寻找鸭子:alias ducks='du -cksh * | sort -hr | head -n 15'
Sebi

Answers:


1547

尝试类似的东西:

du -sh *

简短版本:

du --summarize --human-readable *

说明:

dud ISK ü鼠尾草

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

-h:“人类可读”输出。使用单位后缀:B yte,K ibibyte(KiB),M EB(MiB),G ibibyte(GiB),T EB(TiB)和P EB(PiB)。(BASE2)


55
-c(产生总计)也很不错。
子午线

50
du --max-depth 1仅在树中显示文件/文件夹大小为1的深度,不再混乱并且易于在文件夹中找到大文件夹。
CousinCocaine 2014年

12
怎么也包括隐藏文件?
Zakaria Braksa 2015年

5
@sh在zsh中,您可以使用*(D)来将隐藏的(d ot)文件与普通文件匹配。使用bash时,可以同时使用* .[!.]*两者。
塞比

22
要清楚地知道空间的位置,du -sch * .[!.]* | sort -rh很好(显示排序的输出)在mac上:brew install coreutils然后du -sch * .[!.]* | gsort -rh
Guig,2016年

319

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


11
附加一个| tail -r以最大的顺序排序。
Phrogz

68
sort -rn以相反的数字顺序对事物进行排序。sort -rn | head -n 10如果感兴趣的话,将仅显示前几个。
AgileTillIDie 2014年

14
sort -rh它将du -cksh *人类可读的单位排序时,将可以很好地工作。
塞比

不幸的是,@ Sebi -h不是在Mac上用于排序的有效参数
anon58192932,2016年

@Sebi也不需要-c,du -ksh | sort -rn与相同du -cksh | sort -rn。就像du -ksh是一样的du -cksh
hello_there_andy


55

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

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

它使阅读更加方便:)


27

要以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

任何方式排序此输出?对于Mac上的任何人,如果您将其删除,效果也非常出色--color=no
anon58192932,2016年

@ anon58192932您可以将输出传递sort --key=5,5h给第五列的“人类可读单位” 以进行排序
Sebi,

返回sort: stray character in field spec: invalid field specification 5,5h'`。我真的讨厌macs有时= \
anon58192932

@ anon58192932您可以提出一个与mac有关的问题,我确定有人可以提供帮助。这个问题被标记为GNU / linux
Sebi

2
有没有办法使用这个答案来保留色彩?
Pablo Canseco

20

您想要的命令是'du -sk'du =“ disk Usage”

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

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


在根目录上对此进行了尝试,但仍尝试列出子目录,从而产生大量消息。
Nagev '17

14

将此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实用程序根据您提供的规范从其输入中创建列。给定两个输入文件,它以制表符作为分隔符并排放置。

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

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

双重减号(--)表示向du和的命令行选项结束ls。没有这些,说duls -l会混淆du和任何选项duls没有会混淆ls(即同时存在于公用事业和选项可能并不意味着同样的事情,这将是一个非常混乱)。

cutdu简单地削减了的第一列du -hs输出(尺寸)。

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

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

已在bash和中对此进行了测试ksh93。不适用于/bin/sh


真好。权限大小在同一行

7

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


5
这应该是一条评论,为@molf提供的更正确和更好解释的答案提供更多信息。它不应该被视为一个单独的答案
code_monk 2015年


7

ncdu 诅咒 du

这个很棒的CLI实用程序使您可以轻松地以交互方式查找大文件和目录。

例如,在一个知名项目的树中,我们执行以下操作:

sudo apt-get install ncdu
ncdu

结果如下:

在此处输入图片说明

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

在此处输入图片说明

ncdu 在启动时只为整个树递归计算一次文件大小,因此效率很高。

“磁盘总使用量”与“表观大小”的比较类似于du,我在下面进行了解释:为什么`du`的输出通常与`du -b`如此不同?

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

相关问题:

在Ubuntu 16.04中测试。

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中测试。


1
惊人。感谢分享!
Frank Fu

我同意,ncdu是必经之路...但是您知道是否可以搜索JSON文件吗?即,获取特定文件/文件夹的完整路径。
FGV

1
@FGV我认为ncdu无法输出,一种可能性是破解一个简单的解析JSON的python脚本。
Ciro Santilli冠状病毒审查六四事件法轮功


4

这是我喜欢的一个

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

/var在ubuntu上的示例输出:

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

3

这些都是不错的建议,但我使用的是:

du -ksh * | sort -n -r

-ksh 确保文件和文件夹以易于阅读的格式以及兆字节,千字节等形式列出。然后,对它们进行数字排序并颠倒排序,以便将大的放在首位。

该命令的唯一缺点是计算机不知道千兆字节大于兆字节,因此它只会按数字排序,并且您经常会找到类似以下的清单:

120K
12M
4G

请小心看一下设备。

此命令在Mac上也可以使用(sort -h但不适用于此命令)。


如果您-hdu命令中删除该标志,则会减少不利之处
Carlos Ricardo

或者您也可以使用-h而不是-n排序。
塞比

或仅通过grep G将其通过管道传递
gforce89 '16

3
du -S

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

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

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

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

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



2

如果您要比较文件大小,则只是警告。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"

1

要递归显示当前目录的文件和子目录大小:

du -h .

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

du -h --max-depth=1 .

1

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

du -sh

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

du -sh *

我花了一段时间才意识到Nautilus将已删除的文件发送到其“废纸folder”文件夹,该文件夹未在du -sh *命令中列出。因此,只是想分享一下,以防有人遇到相同的问题。


1

嗯,最好的方法是使用以下命令:

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

然后,您将能够在所有服务器上获取所有大小的文件夹。轻松帮助您找到最大的尺寸。


1

以下内容很容易记住

ls -ltrapR

列出目录内容

-l使用长列表格式

-t按修改时间排序,最新的优先

-r,--reverse反向排序

-a,--all不要忽略以开头的条目。

-p,--indicator-style =斜线将/指示符附加到目录

-R,--recursive递归列出子目录

https://explainshell.com/explain?cmd=ls+-ltrapR


1

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

$ du -ht 1000000000 | sort --reverse

du- dISK u鼠尾草
h -人类可读的格式
t -阈值大小

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

$ du -ht 1G | sort --reverse

说明

Wiki描述的单位如下:

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


0

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

我没有使用脚本,而是将-b标记添加到,du该标记以字节为单位计算大小,据我确定可以消除这两个服务器上的差异。您仍然可以-s -h用来获取可理解的输出。


0

放置在初始化脚本中,例如.bashrc ...根据需要调整def。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.