【问题标题】:Using ls to list directories and their total sizes使用 ls 列出目录及其总大小
【发布时间】:2010-11-04 09:11:39
【问题描述】:

是否可以在 Unix 中使用 ls 列出子目录的总大小及其所有内容,而不是通常的 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

在浏览了手册页之后,我发现我是空的。

【问题讨论】:

  • 你想用 du -s 代替
  • 正在寻找鸭子:alias ducks='du -cksh * | sort -hr | head -n 15'

标签: linux unix


【解决方案1】:

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

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

【讨论】:

  • 附加| tail -r 以按最大优先排序。
  • sort -rn 以相反的数字顺序对事物进行排序。 sort -rn | head -n 10 将只显示前几个,如果有任何兴趣的话。
  • sort -rh 可以很好地与 du -cksh * 配合使用,因为它可以对人类可读的单元进行排序。
  • @Sebi 也不需要 -c,du -ksh | sort -rndu -cksh | sort -rn 相同。正如du -kshdu -cksh 一样。
  • 为什么需要 -k ?在文档中它说: -k like --block-size=1K ,这会影响精度吗?
【解决方案2】:
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 的行为。

【讨论】:

    【解决方案3】:

    ncdu (ncurses du)

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

    例如,从a well known open source project 的根内部我们这样做:

    sudo apt install ncdu
    ncdu
    

    结果如下:

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

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

    “总磁盘使用量”与“表观大小”类似于du,我已经在why is the output of `du` often so different from `du -b`进行了解释

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

    相关问题:

    在 Ubuntu 16.04 中测试。

    Ubuntu 列表根目录

    你可能想要:

    ncdu --exclude-kernfs -x /
    

    地点:

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

    MacOS 10.15.5 列表根目录

    要在该系统上正确列出根/,我还需要--exclude-firmlinks,例如:

    brew install ncdu
    cd /
    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 中测试。

    【讨论】:

    • 太棒了。感谢分享!
    • 我同意,ncdu 是要走的路……但你知道是否可以搜索 JSON 文件吗?即获取特定文件/文件夹的完整路径。
    • @FGV 我不认为 ncdu 可以输出,一种可能性是破解一个解析 JSON 的简单 python 脚本。
    • 想说的话,和平-
    【解决方案4】:

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

    如果您想知道目录中所有文件的大小,对于每个目录,您可以执行以下操作:

    for x in ./*;
    do
        if [[ -f "$x" ]]; then
            ls -al "$x"
        fi
    done | awk '{print $6}' | awk '{s+=$1}END{print s}'
    

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

    【讨论】:

      【解决方案5】:

      仅从 ls 中检索大小(以字节为单位)。

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

      【讨论】:

      • 这个答案不起作用。你可以try it here。对于包含 1MB 文件的目录 dirls ... 报告 8ls ... dir | ... 报告 1024
      【解决方案6】:

      尝试类似:

      du -sh *
      

      短版:

      du --summarize --human-readable *
      

      说明:

      du: Disk Usage

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

      -h:“人类可读”输出。使用单位后缀:Byte、Kibibyte (KiB)、Mebibyte (MiB)、Gibibyte ( GiB)、Tebibyte (TiB) 和 Pebibyte (PiB)。 (基础2)

      【讨论】:

      • 另外 -c (产生总计)很好。
      • du --max-depth 1 仅显示树中深度为 1 的文件/文件夹大小,不再杂乱且易于在文件夹中找到大文件夹。
      • 如何也包含隐藏文件?
      • @Zak in zsh 您可以使用*(D) 来匹配隐藏(dot)文件和普通文件。使用 bash 时,您可以使用 * .[!.]* 来匹配两者。
      • 要清楚地了解空间的去向,du -sch * .[!.]* | sort -rh 很棒(显示排序的输出)在 mac 上:brew install coreutils 然后du -sch * .[!.]* | gsort -rh
      【解决方案7】:

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

      $ du -ht 1000000000 | sort --reverse
      

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

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

      $ du -ht 1G | sort --reverse
      

      说明

      described in wiki 的单位如下:

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

      【讨论】:

        【解决方案8】:

        像.bashrc 这样的初始化脚本...根据需要调整def。

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

        【讨论】:

          【解决方案9】:

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

          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
          

          阅读起来更方便:)

          【讨论】:

            【解决方案10】:

            这是我喜欢的一个

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

            /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
            

            【讨论】:

              【解决方案11】:

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

              【讨论】:

              • 有什么方法可以对这个输出进行排序?如果您删除 --color=no
              • @anon58192932 您可以将输出通过管道传输到sort --key=5,5h,以便从第五列对“人类可读单元”进行排序
              • 返回sort: stray character in field spec: invalid field specification 5,5h'`。有时候我真的很讨厌 Mac =\
              • 有没有办法使用这个答案来保存颜色?
              • 格式化结果:(du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { printf("%11s %4s %-6s %-6s %7s %3s %2s %5s %s\n", $1, $2, $3, $4, SIZES["./" $9], $6, $7, $8, $9) } }' |排序 --key=5,5h
              【解决方案12】:
              du -sh * | sort -h
              

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

              【讨论】:

              • 更多关于sort -h的信息在这里:gnu.org/software/coreutils/manual/…它特别适用于对103K102M1.1G等进行排序。现在应该在很多系统上都可以使用,但不是全部.
              • duh -shm * |排序 -n ?
              • 效果很好,添加了一点du -sh * | sort -rh(-r 用于首先列出更大的文件夹)
              • 包含隐藏文件/目录; du -sh $(ls -A) | sort -h
              【解决方案13】:

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

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

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

              双减号 (--) 向duls 发出命令行选项的结束信号。没有这些,说duls -l 会混淆dudu 的任何选项ls 没有会混淆ls(并且两个实用程序中存在的选项可能不意味着同一件事,它会很乱)。

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

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

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

              这已经在bashksh93 中进行了测试。它不适用于/bin/sh

              【讨论】:

              • 很好。权限一行大小
              【解决方案14】:

              键入“ls -ltrh /path_to_directory”

              【讨论】:

              • ls 没有列出目录内容的大小(而是给出了目录 file 的大小,该目录只存储它包含的文件的名称,并且so 非常小),因此对这个目的没有用处。
              【解决方案15】:

              du -sm * |排序 -nr

              按大小输出

              【讨论】:

                【解决方案16】:

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

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

                【讨论】:

                  【解决方案17】:

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

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

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

                  【讨论】:

                    【解决方案18】:

                    只是一个警告,如果你想比较文件的大小。 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"
                    

                    【讨论】:

                      【解决方案19】:
                      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
                      

                      【讨论】:

                        【解决方案20】:

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

                        显示的总大小
                        du -sh
                        

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

                        du -sh *
                        

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

                        【讨论】:

                          【解决方案21】:

                          du -sch * 在同一目录中。

                          【讨论】:

                            【解决方案22】:
                            du -h --max-depth=1 . | sort -n -r
                            

                            【讨论】:

                            • du -h -d 1 表示最大深度为 1。短格式。
                            • du -hd1 = 短格式 ;)
                            【解决方案23】:

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

                            du -ksh * | sort -n -r
                            

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

                            此命令的唯一缺点是计算机不知道 Gigabyte 大于 MB,因此它只会按数字排序,并且您经常会找到这样的列表:

                            120K
                            12M
                            4G
                            

                            请注意看单位。

                            此命令也适用于 Mac(例如,sort -h 不适用)。

                            【讨论】:

                            • 如果你从 du 命令中删除 -h 标志,你就会减少它的缺点
                            • 或者您也可以在排序中使用-h 而不是-n
                            • 或者只是通过 grep G 管道它
                            【解决方案24】:

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

                            du -h .
                            

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

                            du -h --max-depth=1 .
                            

                            【讨论】:

                              【解决方案25】:

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

                              【讨论】:

                              • 这应该是一条评论,为@molf 接受的更正确和更好解释的答案提供更多信息。它不应该被视为自己的答案
                              【解决方案26】:

                              你想要的命令是 'du -sk' du = "disk usage"

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

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

                              【讨论】:

                              • 在根目录试了下,还是尝试列出子目录,导致消息很多。
                              【解决方案27】:

                              查看du 命令

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2011-07-14
                                • 2011-07-07
                                • 2015-08-03
                                • 1970-01-01
                                • 2021-03-17
                                • 2012-12-30
                                相关资源
                                最近更新 更多