if($1 == "total") { // Set X when start of ls is detected
X = 1
} else if (!X) { // Until X is set, collect the sizes from `du`
SIZES[$2] = $1
} else {
// Replace the size on current current line (with alignment)
sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0);
print $0
}
样本输出:
drwxr-xr-x 2 root root 4.0K Feb 12 16:43 cgi-bin
drwxrws--- 6 root www 20M Feb 18 11:07 document_root
drwxr-xr-x 3 root root 1.3M Feb 18 00:18 icons
drwxrwsr-x 2 localusr www 8.0K Dec 27 01:23 passwd
echo "[GetFileSize.sh] target directory: \"$1\""
iRetValue=0
uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
echo "[GetFileSize.sh] invalid target directory: \"$1\" - exiting!"
iRetValue=-1
else
echo "[GetFileSize.sh] computing size of files..."
# use ls to compute total size of all files - skip directories as they may
# show different sizes, depending on block size of target disk / file system
uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk '{total+=$5;} END {print total;}')
uiLength=$(expr length "$uiTotalSize")
if [ $uiLength -lt 1 ]; then
uiTotalSize=0
fi
echo -e "[GetFileSize.sh] total target file size: \"$uiTotalSize\""
fi
exit "$iRetValue"
-1
以递归方式显示当前目录的文件和子目录大小:
du -h .
要显示 same size information 但 without 递归打印它们的子目录(可能是一个巨大的列表),只需使用--max-depth选项:
23 回答
尝试以下方法:
简短版本:
说明:
du
: D isk U sage-s
:显示每个指定文件的摘要 . (相当于-d 0
)-h
:"Human-readable"输出 . 使用单位后缀: B yte, K ibibyte(KiB), M ebibyte(MiB), G ibibyte(GiB), T ebibyte(TiB)和 P ebibyte(PiB) . (BASE2)du -sk * | sort -n
将按大小对文件夹进行排序 . 想要清理空间有帮助..这将以人类可读的格式显示 .
以人类可读格式列出当前目录中的最大目录:
du -sh * | sort -hr
限制行数的更好方法是
du -sh * | sort -hr | head -n10
您可以在其中增加
-n
标志的后缀以限制列出的行数样品:
它使阅读更方便:)
要以
ls -lh
格式显示,请使用:awk代码解释说:
样本输出:
你想要的命令是'du -sk'du =“磁盘使用”
-k标志为您提供以千字节为单位的输出,而不是磁盘扇区的du默认值(512字节块) .
-s标志仅列出顶级目录中的内容(即默认情况下的当前目录或命令行中指定的目录) . 在这方面,du具有相反的ls行为,这很奇怪 . 默认情况下,du将递归地为您提供每个子目录的磁盘使用情况 . 相反,ls只会在指定目录中提供列表文件 . (ls -R为您提供递归行为 . )
将此shell函数声明放在shell初始化脚本中:
我称之为
duls
,因为它显示了du
和ls
(按此顺序)的输出:说明:
paste
实用程序根据您提供的规范从其输入创建列 . 给定两个输入文件,它将它们并排放置,并使用制表符作为分隔符 .我们给它输出
du -hs -- "$@" | cut -f1
作为第一个文件(真正的输入流)和ls -ld -- "$@"
的输出作为第二个文件 .在函数中,
"$@"
将计算所有命令行参数的列表,每个参数都用双引号括起来 . 因此,它将理解带有空格等的通配字符和路径名 .双精度(
--
)表示命令行选项的结尾为du
和ls
. 没有这些,说duls -l
会混淆du
和ls
没有的任何选项ls
会混淆ls
(两个实用程序中存在的选项可能并不意味着同样的事情,而且会非常混乱) .du
之后的cut
只是简单地删除了du -hs
输出的第一列(大小) .我决定将
du
输出放在左边,否则我将不得不管理一个摇摆不定的右列(由于文件名的长度不同) .该命令不接受命令行标志 .
这已在
bash
和ksh93
中进行了测试 . 它不适用于/bin/sh
.我总是使用
du -sk
(-k
标志显示文件大小,以千字节为单位) .du -sch *在同一目录中 .
这是我喜欢的
更新:我不喜欢上一个,因为它没有在当前目录中显示文件,它只列出了目录 .
ubuntu上
/var
的示例输出:sudo du -hDaxd1 /var | sort -h | tail -n10
看看
du
命令这些都是很好的建议,但我使用的是:
-ksh
确保文件和文件夹以人类可读的格式列出,并以兆字节,千字节等为单位 . 然后,您可以对它们进行数字排序并反转排序,以便将较大的文件和文件夹放在第一位 .这个命令的唯一缺点是计算机不知道技嘉大于兆字节,所以它只会按数字排序,你会经常找到这样的列表:
小心看看单位 .
此命令也适用于Mac(而
sort -h
不适用) .du有另一个有用的选择:
-S, --separate-dirs
告诉du不包括子目录的大小 - 在某些情况下很方便 .示例1 - 仅显示目录中的文件大小:
示例2 - 显示目录中的文件大小和子目录:
du -sm * |排序-nr
按大小输出
只是一个警告,如果你想比较文件的大小 . du根据文件系统,块大小,...产生不同的结果 .
可能发生文件的大小不同,例如,比较本地硬盘上的同一目录和USB海量存储设备 . 我使用以下脚本,包括ls来总结目录大小 . 结果以字节为单位考虑所有子目录 .
以递归方式显示当前目录的文件和子目录大小:
要显示 same size information 但 without 递归打印它们的子目录(可能是一个巨大的列表),只需使用--max-depth选项:
有一段时间,我使用Nautilus(在RHEL 6.0上的Gnome桌面上)删除我的主文件夹上的文件,而不是在bash中使用
rm
命令 . 结果,显示的总大小在我使用时,与每个子目录的磁盘使用量之和不匹配
我花了一段时间才意识到Nautilus将已删除的文件发送到其Trash文件夹,并且该文件夹未在
du -sh *
命令中列出 . 所以,只是想分享这个,以防有人遇到同样的问题 .嗯,最好的方法是使用这个命令:
然后,您将能够在所有服务器上获取所有大小的文件夹 . 轻松帮助您找到最大的尺寸 .
我遇到了类似于Martin Wilde描述的问题,在我的情况下,在使用rsync镜像后比较两个不同服务器上的相同目录 .
我没有使用脚本,而是将
-b
标志添加到du
,它以字节为单位计算大小,据我所知,消除了两台服务器上的差异 . 您仍然可以使用-s -h
来获得可理解的输出 .以下内容易于记忆
https://explainshell.com/explain?cmd=ls+-ltrapR
放在init脚本中,如.bashrc ...根据需要调整def .
输入“ls -ltrh / path_to_directory”