是否有可能在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 -sk' du = "磁盘使用率"

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

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

其他回答

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

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

du -ksh * | sort -n -r

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

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

120K
12M
4G

只是要仔细观察单位。

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

输入“ls -ltrh /path_to_directory”

把这个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

解释:

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

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

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

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

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

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

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

这已经在bash和ksh93中进行了测试。它不能在/bin/sh上工作。