当我使用ls
或du
命令时,会显示每个文件占用的磁盘空间大小。
我需要计算所有文件和子目录中的数据总量,即打开每个文件并计算字节数。如果我不需要打开每个文件并逐一计算,则可以获得额外加分。
如果您想要获取“表面大小”(即每个文件中的字节数),而不是磁盘上占用的大小,请使用-b
或--bytes
选项(如果您使用带有GNU coreutils的Linux系统):
% du -sbh <directory>
du -shb
命令(如此答案所建议的)时,-b
设置好像会覆盖 -h
设置。 - Mathias Bynensdu -sh --apparent-size /dir/
- Jongosi使用du -sb
命令:
du -sb DIR
可以选择添加h
选项以获得更加用户友好的输出:
du -sbh DIR
brew install coreutils
,安装后可以使用命令gdu
来调用。 - neu242ls
-> file.gz hardlink-to-file.gz
。stat -c %s file.gz
-> 9657212
。stat -c %s hardlink-to-file.gz
-> 9657212
。du -sb
-> 9661308
。它绝对不是内容的总大小,而是目录在磁盘上占用的大小。 - anton_rhdu -sh
du
就会跟随符号链接。 - conradkleinespel这只是一种替代方法:
ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
grep -v '^d'
将排除目录。
ls -lR | grep '.png$' | awk '{total += $5} END {print "总计:", total/1024/1024, "MB"}'
- MusikPolicedu
不同,该解决方案确实计算了所有文件中数据的总大小,就好像它们逐个打开并计算其字节数一样。但是,是的,需要添加-A
参数才能计算隐藏文件的大小。 - anton_rhstat的"%s"格式可以给你一个文件中实际字节数。
find . -type f |
xargs stat --format=%s |
awk '{s+=$1} END {print s}'
随意使用您最喜欢的求和方法进行替换。
find -print0
е’Ңxargs -0
гҖӮеңЁOS Xзі»з»ҹдёӯпјҢеә”дҪҝз”Ёе‘Ҫд»Өstat -f %z
жқҘиҺ·еҸ–ж–Ү件еӨ§е°ҸгҖӮ - Korneldu
实用程序的许多答案不同,这个答案是正确的。它非常类似于这里的答案:https://unix.stackexchange.com/a/471061/152606。但我会使用 ! -type d
而不是 -type f
来计算符号链接的大小(通常只有几个字节的符号链接本身的大小,而不是它指向的文件的大小)。 - anton_rh如果您在嵌入式系统中使用busybox的“du”,那么您无法获得准确的字节数,只能获得Kbytes。
BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary
Usage: du [-aHLdclsxhmk] [FILE]...
Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.
Options:
-a Show sizes of files in addition to directories
-H Follow symbolic links that are FILE command line args
-L Follow all symbolic links encountered
-d N Limit output to directories (and files with -a) of depth < N
-c Output a grand total
-l Count sizes many times if hard linked
-s Display only a total for each argument
-x Skip directories on different filesystems
-h Print sizes in human readable format (e.g., 1K 243M 2G )
-m Print sizes in megabytes
-k Print sizes in kilobytes(default)
对于Win32 DOS,您可以:
c:> dir /s c:\directory\you\want
倒数第二行将告诉你文件占用的字节数。
我知道这会读取所有文件和目录,但在某些情况下运行速度更快。
mkdir test && du -b test
如果一个目录为空,则其结果为4096字节。因此,如果您将两个大小为10000字节的文件放入该目录中,则du -sb给出的总量将为24096字节。
仔细阅读问题,这不是所要求的。提问者问道:
如果我打开每个文件并计算字节数,所有文件和子目录中的数据总和是多少字节
在上面的示例中应为20000字节,而不是24096字节。
因此,正确答案可能是Nelson答案和hlovdal建议处理包含空格的文件名的混合。
find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
docroot
中,包括71,158个文件和30,027个目录)。
1.
$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes
real 0m0.221s
user 0m0.068s
sys 0m0.160s
2.
$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes
real 0m0.256s
user 0m0.164s
sys 0m0.196s
3.
$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes
real 0m0.553s
user 0m0.308s
sys 0m0.416s
$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes
real 0m0.233s
user 0m0.116s
sys 0m0.176s
2.
$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes
real 0m0.242s
user 0m0.104s
sys 0m0.152s
如果你只想要当前目录下的总数,那么在find
命令中加入-maxdepth 1
。
请注意,一些建议的解决方案可能会返回不准确的结果,所以我建议使用上述的解决方案。
$ du -sbh
832M .
$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525
$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471
$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
du
很方便,但是如果你只想计算一些文件的大小(例如,使用扩展名过滤器),find
非常有用。此外,请注意,find
本身可以打印每个文件的大小(以字节为单位)。为了计算总大小,我们可以按以下方式连接dc
命令:
find . -type f -printf "%s + " | dc -e0 -f- -ep
这里的find
生成了一系列dc
命令,如123 + 456 + 11 +
。
尽管如此,完成的程序应该像0 123 + 456 + 11 + p
一样(记住后缀表示法)。
因此,为了获得完成的程序,在执行来自stdin的序列之前,我们需要在堆栈上放置0
,并在执行后打印顶部数字(最后的p
命令)。
我们通过dc
选项实现:
-e0
只是-e '0'
的快捷方式,将0
放入堆栈中,-f-
用于从stdin读取和执行命令(这里由find
生成),-ep
用于打印结果(-e 'p'
)。要打印以MiB为单位的大小,如284.06 MiB
,可以在第3点中使用-e '2 k 1024 / 1024 / n [ MiB] p'
(大多数空格是可选的)。
du
命令不能用来回答这个问题。它显示目录在磁盘上占用的磁盘空间(文件数据加上辅助文件系统元信息的大小)。du
命令的输出甚至可能比所有文件的总大小还要小。这可能是因为文件系统可以在磁盘上存储压缩数据或使用硬链接。正确的答案基于ls
和find
命令。请参考此处 Nelson 和 bytepan 的答案,或者查看这个答案:https://unix.stackexchange.com/a/471061/152606。 - anton_rh