如果我有文件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
使用stat
和awk
:
$ 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
其中a
、b
和c
是您要添加其大小(以字节为单位)的文件。
另一种解决方案是在 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
从元数据中获取字节计数并对它们求和的解决方案可能会更快。