首页 文章

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

提问于
浏览
661

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

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

在搜索了这些手册页后,我空无一人 .

23 回答

  • 20

    尝试以下方法:

    du -sh *
    

    简短版本:

    du --summary --human-readable *
    

    说明:

    duD isk U sage

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

    -h :"Human-readable"输出 . 使用单位后缀: B yte, K ibibyte(KiB), M ebibyte(MiB), G ibibyte(GiB), T ebibyte(TiB)和 P ebibyte(PiB) . (BASE2)

  • 7

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

  • 4
    du -sh * | sort -h
    

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

  • 3

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

    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
    

    它使阅读更方便:)

  • 3

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

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

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

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

  • 267

    将此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 会混淆 duls 没有的任何选项 ls 会混淆 ls (两个实用程序中存在的选项可能并不意味着同样的事情,而且会非常混乱) .

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

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

    该命令不接受命令行标志 .

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

  • 0

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

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

    du -sch *在同一目录中 .

  • 1

    这是我喜欢的

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

    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
    
  • 2

    看看 du 命令

  • 4

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

    du -ksh * | sort -n -r
    

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

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

    120K
    12M
    4G
    

    小心看看单位 .

    此命令也适用于Mac(而 sort -h 不适用) .

  • 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
    
  • 3

    du -sm * |排序-nr

    按大小输出

  • 1252

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

    要显示 same size informationwithout 递归打印它们的子目录(可能是一个巨大的列表),只需使用--max-depth选项:

    du -h --max-depth=1 .
    
  • 23

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

    du -sh
    

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

    du -sh *
    

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

  • 6

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

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

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

  • 1

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

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

  • 0

    以下内容易于记忆

    ls -ltrapR
    

    列表目录内容-l使用长列表格式-t按修改时间排序,最新的第一个-r, - 反向顺序排序-a, - all不忽略以 . 开头的条目 . -p, - 指示符样式=斜杠追加/指示目录-R, - 递归列表子目录递归

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

  • 9

    放在init脚本中,如.bashrc ...根据需要调整def .

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

    输入“ls -ltrh / path_to_directory”

相关问题