Linux 使用ls列出目录及其总大小
在Unix中是否可以使用Linux 使用ls列出目录及其总大小,linux,unix,Linux,Unix,在Unix中是否可以使用ls列出子目录及其所有内容的总大小,而不是通常的4K(我假定)仅列出目录文件本身 total 12K drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk 在浏览了手册页之后,我的结果是空的。请查看du命令,然后尝试以下操作
ls
列出子目录及其所有内容的总大小,而不是通常的4K
(我假定)仅列出目录文件本身
total 12K
drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk
在浏览了手册页之后,我的结果是空的。请查看
du
命令,然后尝试以下操作:
du -sh *
简短版本:
du --summarize --human-readable *
说明:
du
:DiskUsage
-s
:显示每个指定文件的摘要。(相当于-d0
)
-h
:“人类可读”输出。使用单位后缀:Byte、Kibibibyte(KiB)、Mebibyte(MiB)、Gibibibyte(GiB)、Tebibyte(TiB)和Pebibibyte(PiB)。(BASE2)我总是使用du-sk
(-k
标志,以千字节为单位显示文件大小) 您需要的命令是'du-sk'du=“磁盘使用”
k标志以千字节为单位提供输出,而不是磁盘扇区(512字节块)的默认值
-s标志将只列出顶级目录中的内容(即默认情况下的当前目录或命令行上指定的目录)。奇怪的是,du在这方面的行为与ls相反。默认情况下,du将递归地向您提供每个子目录的磁盘使用情况。相反,ls将只提供指定目录中的列表文件。(ls-R提供递归行为。)du-sk*| sort-n将按大小对文件夹进行排序。在寻找清理空间时很有用
du -sh * | sort -h
这将以人类可读的格式显示。要递归显示当前目录的文件和子目录大小,请执行以下操作:
du -h .
要显示相同大小的信息但而不递归打印其子目录(可能是一个巨大的列表),只需使用--max depth选项:
这些都是很好的建议,但我使用的是:
du -ksh * | sort -n -r
-ksh
确保文件和文件夹以人类可读的格式列出,并以兆字节、千字节等为单位。然后对它们进行数字排序,并反向排序,以便将较大的文件和文件夹放在第一位
此命令的唯一缺点是,计算机不知道千兆字节大于兆字节,因此它将仅按数字排序,您通常会发现如下列表:
120K
12M
4G
只要仔细看看这个装置就行了
此命令也适用于Mac(例如,
sort-h
不适用)。du-sch*位于同一目录中。要以ls-lh
格式显示,请使用:
find . -maxdepth 1 -exec du --apparent-size --max-depth=0 --null '{}' ';' |\
sort -k1 -nr --zero-terminated |\
cut -f2 --zero-terminated |\
xargs --null -n 1 du -h --apparent-size --max-depth=0
(du-sh./*;ls-lh--color=no){if($1==“total”){X=1}else如果(!X){size[$2]=$1}else{sub($5“[]*”,sprintf(%-7s),size[“/”$9]),$0);打印$0}
Awk代码说明:
if($1==“total”){//检测到ls开始时设置X
X=1
}否则,如果(!X){//直到设置了X,则从'du'收集大小`
尺码[$2]=$1
}否则{
//替换当前行上的尺寸(对齐)
sub($5“[]*”,sprintf(%-7s),尺寸[“/”$9]),0美元;
打印$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
要以可读格式列出当前目录中最大的目录,请执行以下操作:
du-sh*| sort-hr
限制行数的更好方法是
du-sh*| sort-hr | head-n10
4.0K /var/lock
4.0K /var/run
4.0K /var/www
12K /var/spool
3.7M /var/backups
33M /var/log
45M /var/webmin
231M /var/cache
1.4G /var/lib
1.7G /var
其中,您可以增加-n
标志的后缀,以限制列出的行数
样本:
[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M Vendor
1.1M composer.phar
488K phpcs.phar
488K phpcbf.phar
72K doc
16K nbproject
8.0K composer.lock
4.0K README.md
阅读起来更方便:)有一段时间,我使用Nautilus(RHEL 6.0上Gnome桌面上的)来删除我主文件夹中的文件,而不是使用bash中的
rm
命令。因此,显示的总大小为
du -sh
使用时,与每个子目录的磁盘使用量总和不匹配
du -sh *
我花了一段时间才意识到Nautilus会将删除的文件发送到它的垃圾箱文件夹,而该文件夹并没有列在du-sh*
命令中。所以,我想分享一下,以防有人面临同样的问题
du -S
du还有另一个有用的选项:-S,--separate dirs
告诉du不包括子目录的大小-在某些情况下很方便
示例1-仅显示目录中的文件大小:
du -Sh *
3,1G 10/CR2
280M 10
du -h *
3,1G 10/CR2
3,4G 10
示例2-显示目录中的文件大小和子目录:
du -Sh *
3,1G 10/CR2
280M 10
du -h *
3,1G 10/CR2
3,4G 10
如果要比较文件的大小,只需一个警告。du根据文件系统、块大小等产生不同的结果 文件的大小可能不同,例如,比较本地硬盘上的同一目录和USB大容量存储设备。我使用以下脚本(包括ls)来汇总目录大小。将所有子目录都考虑在内,结果以字节为单位
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"
嗯,最好的方法是使用这个命令:
du -h -x / | sort -hr >> /home/log_size.txt
然后,您将能够在所有服务器上获取所有大小的文件夹。很容易帮助您找到最大的大小。我遇到了一个类似于Martin Wilde所描述的问题,在我的例子中,在使用rsync镜像后,比较两个不同服务器上的相同目录 我没有使用脚本,而是将
-b
标志添加到du
中,该标志以字节为单位计算大小,并尽我所能消除两台服务器上的差异。您仍然可以使用-s-h
获得可理解的输出。du-sm*| sort-nr
按大小输出键入“ls-ltrh/path\u to\u目录”将此shell函数声明放入shell初始化脚本中:
function duls {
paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}
说明:
paste
实用程序根据您给定的规范从其输入创建列。给定两个输入文件,它将它们并排放置,并用一个选项卡作为分隔符
我们将du-hs--“$@”cut-f1
的输出作为第一个文件(输入流),将ls-ld--“$@”的输出作为第二个文件
我
ls -ltrapR
duh() {
# shows disk utilization for a path and depth level
path="${1:-$PWD}"
level="${2:-0}"
du "$path" -h --max-depth="$level"
}
$ du -ht 1000000000 | sort --reverse
$ du -ht 1G | sort --reverse
sudo apt install ncdu
ncdu
ncdu --exclude-kernfs -x /
brew install ncdu
cd /
ncdu --exclude-firmlinks
ncdu -o ncdu.json
ncdu -f ncdu.json
ncdu -o - | python -m json.tool | less
[
1,
0,
{
"progname": "ncdu",
"progver": "1.12",
"timestamp": 1562151680
},
[
{
"asize": 4096,
"dev": 2065,
"dsize": 4096,
"ino": 9838037,
"name": "/work/linux-kernel-module-cheat/submodules/linux"
},
{
"asize": 1513,
"dsize": 4096,
"ino": 9856660,
"name": "Kbuild"
},
[
{
"asize": 4096,
"dsize": 4096,
"ino": 10101519,
"name": "net"
},
[
{
"asize": 4096,
"dsize": 4096,
"ino": 11417591,
"name": "l2tp"
},
{
"asize": 48173,
"dsize": 49152,
"ino": 11418744,
"name": "l2tp_core.c"
},
ls -ltr | head -n1 | cut -d' ' -f2
find . -maxdepth 1 -exec du --apparent-size --max-depth=0 --null '{}' ';' |\
sort -k1 -nr --zero-terminated |\
cut -f2 --zero-terminated |\
xargs --null -n 1 du -h --apparent-size --max-depth=0