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

时间:2009-06-19 17:29:00

标签: linux unix

是否可以在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

在搜阅了这些手册页后,我空了。

28 个答案:

答案 0 :(得分:1349)

尝试类似:

du -sh *

简短版:

du --summary --human-readable *

说明:

du D isk U sage

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

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

答案 1 :(得分:290)

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

答案 2 :(得分:92)

du -sh * | sort -h

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

答案 3 :(得分:41)

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

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

它使阅读更方便:)

答案 4 :(得分:23)

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

答案 5 :(得分:20)

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

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

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

答案 6 :(得分:11)

将此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会混淆du du ls没有的任何选项会混淆ls(以及两者中存在的选项)公用事业可能并不意味着同样的事情,而且会非常糟糕。

cut之后的du只会删除du -hs输出的第一列(尺寸)。

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

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

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

答案 7 :(得分:7)

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

答案 8 :(得分:7)

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

答案 9 :(得分:4)

du -sch *在同一目录中。

答案 10 :(得分:4)

这是我喜欢的

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

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

答案 11 :(得分:3)

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

du -ksh * | sort -n -r

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

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

120K
12M
4G

小心看看单位。

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

答案 12 :(得分: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

答案 13 :(得分:3)

查看du命令

答案 14 :(得分:3)

du -sm * | sort -nr

按大小输出

答案 15 :(得分: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"

答案 16 :(得分:2)

ncdu导致du

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

例如,在a well known project树的内部,我们进行以下操作:

sudo apt-get install ncdu
ncdu

结果如下:

enter image description here

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

enter image description here

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

“总磁盘使用量”与“表观大小”的比较类似于du,我在以下网址进行了解释:why is the output of `du` often so different from `du -b`

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

相关问题:

在Ubuntu 16.04中测试。

答案 17 :(得分:1)

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

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

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

答案 18 :(得分:1)

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

显示的总大小
du -sh
当我使用

时,

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

du -sh *

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

答案 19 :(得分:1)

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

du -h .

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

du -h --max-depth=1 .

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

以下内容易于记忆

ls -ltrapR
  

列出目录内容

     

-l使用长列表格式

     

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

     

-r, - 反向          排序时的逆序

     

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

     

-p, - 指示符样式=斜杠          将/指标附加到目录

     

-R, - 递归          以递归方式列出子目录

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

答案 22 :(得分: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"
}

答案 23 :(得分:0)

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

$ du -ht 1000000000 | sort --reverse

du-d isk u鼠尾草
  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的幂)。

答案 24 :(得分:0)

仅从ls中检索字节大小。

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

答案 25 :(得分:0)

请务必注意,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}'

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

答案 26 :(得分:0)

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 的行为。

答案 27 :(得分:-1)

输入&#34; ls -ltrh / path_to_directory&#34;