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
答案 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