ファイルがあり、a
Linuxシステムのディレクトリにある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
使用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
ユーティリティは移植可能ではありませんが、移植可能なシェルスクリプト(またはシェル関数)でラップできます。
#!/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
追加するサイズ(バイト)のファイルです。
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