Answers:
这是一个快速解决方法,请使用du + sort。尝试这个:
du -smc * | sort -n
这将忽略隐藏的文件,但这是另一个简单的解决方法:
du -smc .[^.] .??* * | sort -n
这可能会导致有关上述一种或多种模式与文件不匹配的警告。第一个模式.[^.]
匹配以开头的所有两个字符文件名。除了第二种模式..之外,它.??*
匹配以。开头的所有三个字母或更多文件名。和*匹配所有不以开头的文件。对于更复杂的清单,例如在整个文件系统中查找所有大于X的文件,或者维护文件系统增长的列表,我有一些自己编写的DIY shell脚本,如果您有兴趣可以共享。
sort -nr
如果您想要最大的价值,请使用此选项。
要在下的任何位置列出文件/tmp
,请按大小排序:
find /tmp -type f -exec du -k {} + | sort -k1n -k2
要在下方直接列出文件和目录树/tmp
,请按大小排序:
du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2
要在下的任何位置列出所有文件和目录树/tmp
,请按大小排序:
du -ak /tmp | sort -k1n -k2
(示例说明了这三个命令之间的区别:如果有一个文件/tmp/dir/file
,则第一个命令列表/tmp/dir/file
,第二个列表/tmp/dir
和第三个列表都列出。)
上面的所有命令均以千字节为单位显示大小。尽管GNU du可以输出“人类可读”的大小(具有k,M,G等乘数),但是对它们进行排序是另一回事。最近足够的GNU的coreutils(≥7.4)可以做到这一点:只需更换du -k
与du -h
和sort -k1n -k2
用sort -k1h -k2
。否则,这是一个原始的awk脚本,可以转换为带后缀的大小(四舍五入)。只需将sort
上面的输出通过管道传递给它即可。
awk -vFS='\t' -vOFS='\t' '{
if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
substr("kMGTPEZY",(length($1)-1)/3+1,1);
print}'
du
调用。
我正在使用以下别名: alias ds='du -x --all --max-depth=1 . | sort -n'
它打印所有文件的大小和当前目录的第一级子目录。
使用当前版本的gnu sort(并借用@ penguin359文件模式)
cd /tmp; du -sShc .[^.] .??* * | sort -h
使用较旧的版本
cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done
编辑:添加了-S参数du
以不包括子目录。
--apparent-size
到du参数。
更新:我已经废弃了以前的脚本。这是一个新版本,使用du
和awk
(先前的版本
使用tree
和sed
)
这是以下内容的输出: dusort ~/test 1
================
dir 4.10 KiB /home/user/test/bdir
dir 4.98 KiB /home/user/test/Kdir
dir 104.91 MiB /home/user/test/Mdir
dir 587.47 MiB /home/user/test/Gdir
dir 692.39 MiB /home/user/test
================
f 0 Byt /home/user/test/new file
f 42 Byt /home/user/test/.hi dd en
================
这是脚本
units() { awk -v pfix="$1" \
'BEGIN { yect=6 # Array element-count
split("Byt KiB MiB GiB TiB PiB",lbl)
for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 }
}
{ yess=yect # Array element-subscript
while ( $1 < val[yess] ){ yess-- }
num = $1 / (val[yess]+1)
sub(/^[0-9]*\t*/,"")
if (yess!=1) { printf "%s %8.2f %s %s\n", pfix, num, lbl[yess], $0 }
else { printf "%s %5d %s %s\n", pfix, num, lbl[yess], $0 }
}'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs"; du --max-depth=$2 -b $1 >"$dirs" ; <"$dirs" sort -n | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u | units " f "
echo "================"
rm "$file."*
#
tree
做到这一点。如果您想要使用磁盘空间,则du
执行此操作(tree
不总计目录)
man du
,它也可以报告常规文件上的“表观文件大小” .... The apparent size of a file is the number of bytes reported by
wc -c',或更一般地说,ls -l --block-size=1' or
stat --format =% s'。例如,一个文件包含单词zoo' with no newline would, of course, have an apparent size of 3.