ファイルの合計バイト数

ファイルの合計バイト数

ファイルがあり、aLinuxシステムのディレクトリにあるb場合。表示情報cに依存しない方法で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ユーティリティは移植可能ではありませんが、移植可能なシェルスクリプト(またはシェル関数)でラップできます。

#!/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

ここでabおよびはc追加するサイズ(バイト)のファイルです。

stat別の解決策は、Linuxと同じ実装にアクセスするためにmacOSシステムにGNU coreutilsをインストールすることです。


Linuxでは、次のこともできます。

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

-bただし、GNU coreutilsがインストールされていない場合、macOSまたはBSDシステムにはそれに対応するものはありません(このフラグは実装されていません)。

答え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

この目的のためにfifo/dev/zeroまたは/dev/random

シンボリックリンクを確認してターゲットのサイズを取得する-Lオプションをコマンドに追加できます。find

lstat()残念ながら、POSIXlyでシステムコールによって返されたファイルサイズを取得できる唯一のコマンドはls

ls -lブロックデバイスのサイズを返しません。出力を確実に解析することは非常に難しく、完全な方法で一度に1つのファイルしか実行できません(互換実装ファイルと非デバイスファイルの場合)。

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

関連情報