ls
列出目录内容。du
列出目录内容大小。有没有办法获得ls
类似列表,但目录显示内容大小?
答案1
将此 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
解释:
该paste
实用程序根据您指定的规范从其输入中创建列。给定两个输入文件,它会将它们并排放置,并使用制表符作为分隔符。
我们将的输出du -hs -- "$@" | cut -f1
作为第一个文件(实际上是输入流),将的输出ls -ld -- "$@"
作为第二个文件。
在函数中,"$@"
将评估所有命令行参数的列表,每个参数都用双引号引起来。因此,它将理解通配符和带有空格的路径名等。
双减号 ( ) 表示命令行选项和 的--
结束。如果没有这些,说会让人困惑,而任何没有 的选项也会让人困惑(并且两个实用程序中存在的选项可能意味着不同的事情,这将是一个相当混乱的问题)。du
ls
duls -l
du
du
ls
ls
之后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
笔记:-
- 我在目录大小周围加上了方括号,以将其与文件大小区分开来。
- 由于报告的大小的字符串长度不同
du
,目录条目的制表将会发生偏移,但可以进一步细化命令以解决这个问题。 - 如果文件名中没有空格或其他不可打印的字符,情况会简单得多。
- 该命令通过用 返回的大小替换
ls -l
返回的目录大小来工作du -s
;由于替换的复杂性,du
在确定是否有必要这样做之前调用替换,以简化脚本。 - 最好使用类似方法
[ "$l" == "${l#d}" ] && echo "$l" || { s=$(du ...); sed ...; }
检查目录,然后调用du
并进行替换。 - 如果您没有
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
选项,它以人类可读的类型显示目录内每个文件的大小。