如何以ls格式显示文件和文件夹大小

时间:2014-04-03 10:14:24

标签: linux bash

ls -l将显示所有文件和文件夹的详细信息。但文件夹大小不正确(alwasy show 4.0k)。

那么除了正确大小的文件夹外,如何将文件/文件夹显示为ls -l格式。谢谢!

ls -l format:

drwxr-xr-x  9 jerry jerry XXX.0K Mar  3 14:34 Flask-0.10.1  
-rw-rw-r--  1 jerry jerry 532K Mar  3 14:25 Flask-0.10.1.tar.gz  
drwxrwxr-x 10 jerry jerry XXXK Feb  8 15:41 leveldb1.15

7 个答案:

答案 0 :(得分:2)

您可以使用-printf的{​​{1}}选项获取大部分信息 - 有关详细信息,请参阅the man page。我知道找到包含其中所有内容的目录大小的最简单方法是find,因此您必须将这些值打印/粘贴在一起。例如:

du -s

示例输出:

paste <(find . -maxdepth 1 -printf "%M %u %c %p\n") <(find . -maxdepth 1 -exec du -s {} \; | cut -f1 ) | column -t

所以:权限/所有者/日期/名称/大小(以字节为单位)

答案 1 :(得分:0)

我不太确定这是否是你要找的 - 但来自man ls

  

- 块大小=在打印前按SIZE缩放尺寸。例如,' - block-size = M'以1,048,576字节为单位打印大小。见SIZE   格式如下。

     

SIZE是一个整数和可选单位(例如:10M是10 * 1024 * 1024)。   单位是K,M,G,T,P,E,Z,Y(1024的幂)或KB,MB,......   (1000的权力)。

编辑: 根据您的评论,我会设置一个别名来获取输出,该输出可以提供所需的数据,但会打破ls的典型格式 - 例如:

alias lsd="ls -l && du -h --max-depth 1"

结果:

$ lsd
total 4
dr-xr-xr-x 4 user group 4096 Mar 12  2012 network
12K ./network
16K .

我不知道有任何方法只能通过ls实现您的目标。

答案 2 :(得分:0)

您无法使用ls执行此操作。但是,你可以试试这个,

ls -lhrt | awk '$1 ~ /^d/{"du -sh $9" | getline s; split(s,a," ");$5=a[1];}1'

答案 3 :(得分:0)

肯定有更好的方法,但这对我有用:

ls -l | while read f
do
 echo -ne $( echo $f | cut -f -4 -d ' ')
 echo -ne " $(du -s $(echo $f | cut -f 9 -d ' ') | cut -f 1) ";
 echo $( echo $f | cut -f 6- -d ' ');
done

答案 4 :(得分:0)

引用@izx

  

目录只是指向文件列表的链接。所以你的大小   看到的不是文件夹占用的总空间而是空间   被链接占用。文件或目录条目/链接的最小大小   必须占用的是一个块,最多通常为4096字节/ 4K   ext3 / 4文件系统。

因此显示的最小尺寸只能是4.0k

答案 5 :(得分:0)

之前制作了一个与此类似的脚本(复制了一些ls选项),使du更改并且应该在这里工作

#!/bin/bash

[[ ! -d "$1" ]] && echo "Error $1 not a directory" 1>&2 && exit

for f in "$1"/*; do
  f="${f##*/}"
  symlink=
  if [[ "$(stat -c '%h' "$f")" -gt 9 ]]; then
    string="$(stat -c "%A %h %U %G" "$f")"
  else
    string="$(stat -c "%A  %h %U %G" "$f")"
  fi

  t="$(stat -c "%x" "$f")"

  date="$(date -d "$t" "+%-d")"
  if [[ $date -lt 10 ]]; then
    date="$(date -d "$t" "+%b  %-d %H:%M")"
  else
    date="$(date -d "$t" "+%b %d %H:%M")"
  fi

  if [[ -h $f ]]; then
    size="$(ls -sh "$f" | cut -d ' ' -f1)"
    symlink="$f -> $(readlink "$f")"
    f=
  elif [[ -d $f ]]; then
    size="$(du -sh "$f" | cut -f1 2>&1)"
    f="$f/"
  elif [[ -f $f ]]; then
    size="$(ls -sh "$f" | cut -d ' ' -f1)"
  else
    echo "Error $f" 1>&2 && exit
  fi

  printf "%s %-4s %s %s\n" "$string" "$size" "$date" "${f}$symlink"
done

显然会比常规ls慢一点,因为它必须计算大小。

示例输出

> ./abovescript "./testdir"
drwxrwxr-x  5 owner group 11M  Apr  3 06:53 workspace/
-rwxrwxr-x  1 owner group 8.0K Mar 30 03:53 a.out
lrwxrwxrwx  1 owner group 0    Apr  3 07:19 foo -> test/file

答案 6 :(得分:-1)

尝试:

du -b -d 1

这会将每个文件夹的磁盘使用情况打印到深度1,相当于ls -al