哪个命令将打印 tmp 目录中所有文件和目录(包括隐藏文件和目录)的大小,并以人类可读的格式(例如 2 GB)按大小从最大到最小对它们进行排序?
输出可能如下:
file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)
我尝试使用ls
和du
命令,但无法找到正确的开关。
答案1
这是一个快速修复方法,使用 du + sort。尝试这个:
du -smc * | sort -n
这将忽略隐藏文件,但这是另一个简单的修复:
du -smc .[^.] .??* * | sort -n
如果上述一个或多个模式与文件不匹配,这可能会导致警告。第一个模式.[^.]
匹配以 . 开头的所有两个字符文件名。除了 .. 之外,第二个模式.??*
匹配以 .. 开头的所有三个字母或更多文件名。和 * 匹配所有不以 .对于更复杂的列表,例如在整个文件系统中查找大于 X 的所有文件,或维护文件系统增长列表,我编写了一些 DIY shell 脚本,如果您感兴趣,可以分享。
答案2
要列出 下任意位置的文件/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
(举例说明这三个命令之间的区别:如果有一个 file /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}'
答案3
我使用以下别名:alias ds='du -x --all --max-depth=1 . | sort -n'
它打印当前目录的所有文件和第一级子目录的大小。
答案4
更新:我已经废弃了之前的脚本。这是一个新版本,使用
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."*
#