关于linux:目录中所有文件内容的总大小

Total size of the contents of all the files in a directory

当我使用lsdu时,我得到每个文件所占用的磁盘空间量。

我需要文件和子目录中所有数据的总和,如果我打开每个文件并计算字节数,就会得到这些数据。如果我能在不打开每个文件和计数的情况下获得这个奖励点数。


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

1
% du -sbh <directory>


使用du -sb

1
du -sb DIR

或者,添加h选项以获得更方便用户的输出:

1
du -sbh DIR


CD到目录,然后:

1
du -sh

FTW!

最初是在这里写的:https://ao.gl/get-the-total-size-of-all-the-files-in-a-目录/


只是另一种选择:

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

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


stat的"%s"格式提供文件中的实际字节数。

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

你可以用你最喜欢的方法来求和。


如果在Embedded系统中使用BusyBox的"du",就无法使用du获得精确的字节,只能获得千字节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)


在Linux/Unix和Git Bash for Windows中,至少有三种方法可以获得"文件和子目录中所有数据的总和"(以字节为单位),这些方法按从最快到最慢的平均顺序列出如下。供您参考,它们是在相当深的文件系统的根目录下执行的(在magento 2 Enterprise安装中,docroot包含30027目录中的71158个文件)。

1。

1
2
3
4
5
6
7
$ time find -type f -printf '%s
' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2。

1
2
3
4
5
6
$ 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

三。

1
2
3
4
5
6
$ 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

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

1。

1
2
3
4
5
6
$ time echo `find -type f -printf"%s +" | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2。

1
2
3
4
5
6
7
$ time echo `find -type f -printf '%s
' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s

如果只需要当前目录的合计,则将-maxdepth 1添加到find

请注意,一些建议的解决方案不能返回准确的结果,因此我将继续使用上面的解决方案。

1
2
3
4
5
6
7
8
9
10
11
12
$ 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


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

du命令(带或不带-b选项)使用count这个空格,正如您可以看到键入:

1
mkdir test && du -b test

空目录的结果为4096字节。因此,如果在目录中放入2个10000字节的文件,du-sb给出的总大小将是24096字节。

如果你仔细阅读这个问题,这不是问题所在。提问者问:

the sum total of all the data in files and subdirectories I would get if I opened each file and counted the bytes

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

因此,正确答案imho可以是Nelson answer和hlovdal suggestion的混合,用于处理包含空格的文件名:

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

du很方便,但如果您只想计算某些文件的大小(例如,使用按扩展名筛选),find非常有用。还要注意,find本身可以以字节为单位打印每个文件的大小。要计算总大小,我们可以按以下方式连接dc命令:

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

在这里,finddc生成命令序列,就像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'(大多数空间是可选的)。


    这可能有帮助:

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

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


    对于Win32 DOS,您可以:

    C:>目录C:directoryyouwant

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

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


    用途:

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

    其中

    是要检查的目录。

    "-c"提供使用命令的"grep total"部分提取的总计数据,并且使用awk命令提取以千字节为单位的计数。

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