目录中所有文件内容的总大小


103

当使用ls或时du,我将获得每个文件占用的磁盘空间量。

如果需要打开每个文件并计算字节数,我需要获取文件和子目录中所有数据的总和。如果我不用打开每个文件并进行计数就可以获得奖励积分。


1
ls实际上显示每个文件中的字节数,而不是磁盘空间量。这足以满足您的需求吗?
Greg Hewgill

3
请注意,du不能用来回答这个问题。它显示目录在磁盘上占用的磁盘空间量(文件的数据加上辅助文件系统元信息的大小)。该du输出可以比所有文件的总大小甚至更小。如果文件系统可以将压缩后的数据存储在磁盘上,或者使用硬链接,则可能会发生这种情况。正确答案基于lsfind。请在此处查看Nelsonbytepan的答案,或此答案:unix.stackexchange.com/a/471061/152606
anton_rh 18/09/24

Answers:


108

如果要“表观大小”(即每个文件中的字节数),而不是磁盘上文件占用的大小,请使用-b--bytes选项(如果您的Linux系统具有GNU coreutils):

% du -sbh <directory>

1
可以在我的较新的红色帽子盒上使用,不幸的是不能在我的嵌入式Dev盒上使用。
亚瑟·乌尔费尔特

3
有一种简单的方法可以以人类可读的格式显示“表观尺寸”吗?使用时du -shb(如该答案所建议),该-b设置似乎会覆盖该-h设置。
Mathias Bynens'8年

6
@MathiasBynens反转标志的顺序(即du -sbh <dir>)。为我工作。
路易斯E.13年

2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi 2015年

2
@Arkady我已经在CentOS和Ubuntu上尝试过您的解决方案,并且有一个小错误。您需要“ du -sbh”。“ -h”标志必须排在最后。
theJollySin

46

用途du -sb

du -sb DIR

(可选)添加h选项以获得更用户友好的输出:

du -sbh DIR

4
-b对于
MacOS'du

3
@lynxoid:您可以使用brew:安装GNU版本brew install coreutils。它可以作为命令使用gdu
neu242

1
不起作用。ls-> file.gz hardlink-to-file.gzstat -c %s file.gz-> 9657212stat -c %s hardlink-to-file.gz-> 9657212du -sb-> 9661308。绝对不是内容的总大小,而是目录在磁盘上所占的大小。
anton_rh 18/09/24

24

cd到目录,然后:

du -sh

tw!

最初在这里写过:https : //ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
这很简单并且有效!谢谢。有时,我喜欢添加该-L选项,以便du遵循符号链接。
conradkleinespel 2014年

2
为我工作(在OS X上)
sam boosalis

2
这很简单,不起作用。它打印目录在磁盘上所占用的空间,而不是可以通过打开每个文件并计算字节数来计算的内容的总大小。
anton_rh 18/09/24

17

只是一种选择:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' 将排除目录。


4
完美,还添加-a参数以获取“隐藏文件”(任何以句点开头的内容)
Nicholi 2011年

隔离为特定文件类型(在这种情况下为PNG),并以MB表示,以提高可读性: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

这是正确的答案。与du该解决方案不同的是,它实际上是对文件中所有数据的总大小进行计数,就好像它们被一个一个地打开并且对它们的字节进行计数一样。但是,是的,-A还需要添加参数来计算隐藏文件。
anton_rh 18/09/24

13

stat的“%s”格式为您提供文件中的实际字节数。

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

随意用自己喜欢的方法求和


4
最好使用“ find。-type f -print0 | xargs -0 ...”,以避免某些文件名出现问题(包含空格等)。
hlovdal

1
是的,很好。如果不是在bsd 4.2中,我不记得要使用它:-(
Nelson

3
find -print0并且xargs -0是带空格的文件名所必需的。OS X想要stat -f %z
Kornel

1
(请注意,统计信息适用于稀疏文件,报告的是文件的较大标称大小,而不是du报告中磁盘上使用的较小的块。)
Nelson

1
与此处错误使用du实用程序的许多其他答案不同,此答案是正确的。在这里回答非常相似:unix.stackexchange.com/a/471061/152606。但是我也会使用! -type d而不是-type f计算符号链接(符号链接本身的大小(通常是几个字节),而不是它指向的文件的大小)。
anton_rh

3

如果在嵌入式系统中使用busybox的“ du”,则无法获得带有du的确切字节,只能获得KB的字节数。

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)

3

创建文件夹后,许多Linux文件系统会分配4096字节来存储有关目录本身的一些元数据。随着目录的增加,此空间增加了4096字节的倍数。

du命令(带或不带-b选项)占用此空间,您可以看到键入:

mkdir test && du -b test

您将获得4096字节的空目录结果。因此,如果将2个10000字节的文件放入dir中,则du -sb给出的总数将为24096字节。

如果您仔细阅读了该问题,则不是所问的问题。发问者问:

如果打开每个文件并计算字节数,我将得到的文件和子目录中所有数据的总和

在上面的示例中应为20000字节,而不是24096。

因此,正确的答案恕我直言可能是Nelson答案和hlovdal建议的混合体,用于处理包含空格的文件名:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

至少有三种方法可以获取“文件和子目录中所有数据的总和”(以字节为单位),这些方法在Linux / Unix和Windows的Git Bash中都可以使用,按平均从最快到最慢的顺序列出如下。供您参考,它们是在相当深的文件系统(docroot在Magento 2 Enterprise安装中,包含30,027个目录中的71,158个文件)。

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


这两个也可以使用,但是它们依赖于Windows的Git Bash上不存在的命令:

1。

$ 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


如果只希望当前目录的总数,则添加-maxdepth 1到中find


请注意,某些建议的解决方案不会返回准确的结果,因此我会坚持使用上述解决方案。

$ 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

1
关于Windows的Git Bash,在Cygwin的情况下,dcbc软件包的一部分,因此dc需要安装bc
ruvim '18

1

对于Win32 DOS,您可以:

c:>目录/ sc:\ directory \ you \ want

倒数第二行将告诉您文件占用了多少字节。

我知道这会读取所有文件和目录,但是在某些情况下会更快地工作。


1

du方便,但find在仅计算某些文件大小的情况下很有用(例如,使用扩展名过滤)。还要注意,find它们自己可以打印每个文件的大小(以字节为单位)。要计算总大小,我们可以dc按以下方式连接命令:

find . -type f -printf "%s + " | dc -e0 -f- -ep

在这里finddclike 生成命令序列123 + 456 + 11 +。虽然,完成的程序应该像0 123 + 456 + 11 + p(记住后缀表示法)。

因此,要获得完整的程序,我们需要0在执行stdin序列之前将其放入堆栈,并在执行后打印最高编号(p末尾的命令)。我们通过dc选项实现:

  1. -e0只是快捷方式,-e '0'这使0在栈上,
  2. -f-用于从stdin读取和执行命令(由find此处生成),
  3. -ep用于打印结果(-e 'p')。

要像284.06 MiB我们可以-e '2 k 1024 / 1024 / n [ MiB] p'在第3点中那样使用MiB打印大小(大多数空格是可选的)。


1

这可能会有所帮助:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

上面的命令将总计所有离开目录大小的文件。


1
请注意,此解决方案与Barun 的答案非常相似。但是此解决方案不会汇总子目录中的文件。
ruvim

1
@ruvim,它也不会汇总隐藏文件​​。要汇总隐藏文件​​,-A必须将选项添加到中ls
anton_rh 18/09/24

0

用:

$ du -ckx <DIR> | grep total | awk '{print $1}'

其中<DIR>是要检查的目录。

“ -c”提供使用命令的“ grep total”部分提取的总计数据,而使用awk命令提取的千字节计数。

唯一需要注意的是,如果您有一个包含文本“ total”的子目录,它也会被吐出来。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.