文件总字节数

Jim*_*Jim 5 files

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

更新
1) 我对二进制文件而不是 ascii 文件感兴趣
2) 成为一个可移植的解决方案是理想的,例如 GNU linux 或 Mac 工作

ter*_*don 11

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
Run Code Online (Sandbox Code Playgroud)

现在,运行du

$ du -bc a.txt b.txt c.txt
6   a.txt
12  b.txt
17  c.txt
35  total
Run Code Online (Sandbox Code Playgroud)

如果你只想要一个变量的总大小:

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


Kus*_*nda 8

使用statawk

$ stat --printf '%s\n' some individual files here | awk '{ s += $1 } END { print s }'
Run Code Online (Sandbox Code Playgroud)

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

对于 macOS:

$ stat -f '%z' some individual files here | awk '{ s += $1 } END { print s }'
Run Code Online (Sandbox Code Playgroud)

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 }'
Run Code Online (Sandbox Code Playgroud)

这将被称为

$ ./script a b c
Run Code Online (Sandbox Code Playgroud)

where a,bc是您想要将其大小(以字节为单位)相加的文件。

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


在 Linux 上,你也可以做

$ du -bcl some individual files here | awk 'END { print $1 }'
Run Code Online (Sandbox Code Playgroud)

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

  • 另请注意,如果这些文件中的任何一个是 _directory_ 类型,则将添加下面目录树中所有文件的大小。 (2认同)

Sté*_*las 8

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

find a.txt b.txt c.txt -prune -printf '%s\n' | paste -sd + - | bc
Run Code Online (Sandbox Code Playgroud)

这给出了ls -lstat()系统调用报告的大小。对于非常规文件类型(如 fifo、设备、符号链接),根据系统的不同,可能不一定会为您提供从它们读取的字节数。请参阅那里的更多选项。

你可以这样做:

cat a.txt b.txt c.txt | wc -c
Run Code Online (Sandbox Code Playgroud)

为此,但这不是您想要为 fifos 或某些设备文件(例如/dev/zero/dev/random.

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

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

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

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

(这里假设设备文件的大小为 0,这在 Linux 上总是正确的,但不是在所有系统上)。

然后你可以这样做:

sum=0
for file in a b c; do
  sum=$((sum + $(getsize "$file")))
done
echo "$sum"
Run Code Online (Sandbox Code Playgroud)


Rom*_*est 7

我怎样才能得到这 3 个文件的总字节数

wc + sed方法:

wc -c a.txt b.txt c.txt | sed '$!d;s/total//;'
Run Code Online (Sandbox Code Playgroud)
  • wc -c [FILE]...- 打印每个指定文件的字节数。对于多个文件,打印具有总字节数的行(作为最后一行)


Hun*_*son 2

du将能够解决您的问题。du将显示文件的大小,然后显示目录中所有文件的大小总和。

du -h /path/to/dir
Run Code Online (Sandbox Code Playgroud)

du - 估计文件空间使用情况

  • @Jim 在这种情况下,请[编辑]你的问题并解释一下。您没有提到需要将其保存在任何地方的变量中。 (2认同)