目录内容大小已集成到“ls”中?

目录内容大小已集成到“ls”中?

ls列出目录内容。du列出目录内容大小。有没有办法获得ls类似列表,但目录显示内容大小?

答案1

将此 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 -- "$@"作为第二个文件。

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

双减号 ( ) 表示命令行选项和 的--结束。如果没有这些,说会让人困惑,而任何没有 的选项也会让人困惑(并且两个实用程序中存在的选项可能意味着不同的事情,这将是一个相当混乱的问题)。dulsduls -ldudulsls

之后cut只是du剪切掉输出的第一列du -hs(尺寸)。

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

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

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

答案2

ls -l将显示目录内文件的大小。du -sh *将显示目录的大小。

答案3

我已经设法通过一些相当复杂的调用来做你想做的事情sed:-

ls -d Directory/*|while l="$(line)";\
   do s=$(du -sb "$l"|sed "s/^\([0-9]*\).*$/\1/"); ls -ld "$l"|\
      sed "s/^\(d[^ ]*  *[^ ]*  *[^ ]*  *[^ ]* \) *[^ ]* /\1\[$s\] /g";\
   done

笔记:-

  1. 我在目录大小周围加上了方括号,以将其与文件大小区分开来。
  2. 由于报告的大小的字符串长度不同du,目录条目的制表将会发生偏移,但可以进一步细化命令以解决这个问题。
  3. 如果文件名中没有空格或其他不可打印的字符,情况会简单得多。
  4. 该命令通过用 返回的大小替换ls -l返回的目录大小来工作du -s;由于替换的复杂性,du在确定是否有必要这样做之前调用替换,以简化脚本。
  5. 最好使用类似方法[ "$l" == "${l#d}" ] && echo "$l" || { s=$(du ...); sed ...; }检查目录,然后调用du并进行替换。
  6. 如果您没有line命令,您可以使用while read -r l; do ...,但这会丢失前导和尾随空格,因此我line理所当然地使用。

我确实编写了一个line使用read同时保留所有空白的脚本:

read -r; r=$?; echo "$REPLY"; return $r 2>/dev/null; exit $r

.(如果使用/调用,则复杂的返回/退出序列会阻止 shell 退出source。)

答案4

如果你读过ls命令,您会看到一个-h选项,它以人类可读的类型显示目录内每个文件的大小。

相关内容