文件总字节数

文件总字节数

如果我有文件a,b并且c位于 Linux 机器上的目录中。如何以不依赖于ls显示信息的方式获取这3个文件的总字节数?我的意思是我对一种不易出错的方式感兴趣

更新
1) 我对二进制文件感兴趣,而不是 ascii 文件
2) 最好是一个便携式解决方案,例如 GNU linux 或 Mac 工作

答案1

du-c(打印总数)和-b(字节)选项一起使用:

$ ls -l
total 12
-rw-r--r-- 1 terdon terdon  6 Sep 29 17:36 a.txt
-rw-r--r-- 1 terdon terdon 12 Sep 29 17:38 b.txt
-rw-r--r-- 1 terdon terdon 17 Sep 29 17:38 c.txt

现在,运行du

$ du -bc a.txt b.txt c.txt
6   a.txt
12  b.txt
17  c.txt
35  total

如果您只想要变量的总大小:

$ var=$( du -bc a.txt b.txt c.txt | tail -n1 | cut -f1)
$ echo $var
35

答案2

使用statawk

$ stat --printf '%s\n' some individual files here | awk '{ s += $1 } END { print s }'

stat使用给定的--printf格式(在 Linux 上)将输出给定文件的文件大小。然后代码awk对这些进行总结并报告总计。

对于 macOS:

$ stat -f '%z' some individual files here | awk '{ s += $1 } END { print s }'

stat实用程序是不可移植的,但您可以将其包装在可移植 shell 脚本(或 shell 函数)中:

#!/bin/sh

case $(uname) in
    Linux)       stat --printf '%s\n' "$@" ;;
    Darwin|*BSD) stat -f '%z' "$@" ;;
    *) echo 'Unknown system. I do not know how stat works here' >&2
       exit 1 ;;
esac | awk '{ s += $1 } END { print s }'

这将被称为

$ ./script a b c

其中abc是您要添加其大小(以字节为单位)的文件。

另一种解决方案是在 macOS 系统上安装 GNU coreutils,以访问stat与 Linux 上相同的实现。


在 Linux 上,你还可以这样做

$ du -bcl some individual files here | awk 'END { print $1 }'

但除非安装了 GNU coreutils,否则在 macOS 或 BSD 系统上没有等效的功能(该-b标志未实现)。

答案3

使用 GNU find,您可以执行以下操作:

find a.txt b.txt c.txt -prune -printf '%s\n' | paste -sd + - | bc

ls -l这给出了系统调用报告的大小stat()。对于非常规文件类型(例如 fifo、设备、符号链接),根据系统的不同,这可能不一定会提供从它们中读取的字节数(如果有的话)。看那里以获得更多选择。

你可以这样做:

cat a.txt b.txt c.txt | wc -c

为此,但这不是您想要对 fifos 或某些设备文件(如/dev/zero或 )执行的操作/dev/random

您可以将-L选项添加到find命令中以解析符号链接并获取目标的大小。

不幸的是,POSIXly,唯一可以获取lstat()系统调用返回的文件大小的命令是ls

ls -l不返回块设备的大小。可靠地解析其输出是非常困难的,并且只能以一种万无一失的方式(对于合规实现和非设备文件)一次对一个文件完成:

getsize() {
  LC_ALL=C ls -nd -- "$1" | awk '
   {
     if (/^[cb]/) print 0
     else print $5
     exit
   }
   END {exit (!NR)}'
}

(这里假设设备文件的大小为 0,这在 Linux 上始终如此,但并非在所有系统上)。

然后你可以这样做:

sum=0
for file in a b c; do
  sum=$((sum + $(getsize "$file")))
done
echo "$sum"

答案4

连接所有文件并用于wc计算字节数。

cat a.txt b.txt c.txt | wc -c

请注意,对于非常大的文件,这会很慢,因为它必须读取它们。使用stat和等命令find从元数据中获取字节计数并对它们求和的解决方案可能会更快。

相关内容