158416
757249
574994
144436
520739
210444
398630
1219080
256965
684782
393445
157957
273642
178980
339245
6014031
現在のディレクトリのファイルサイズは次のとおりです。次のコマンドを使用して取得しました。
ls -l | tr -s " " | cut -d " " -f5 | tail +2
とにかく、cut, echo, eval, head, ls, tail, tr
次のコマンドを使用してこれらの15個のサイズをすべて追加すると、すべてのファイルの合計サイズを取得できます。
答え1
そのコマンドリストには数値を追加できるコマンドがないので、シェルの算術拡張を使用する必要があるようです。
それは次のとおりです。
echo "$(($(LC_ALL=C ls -nq | tr -s ' ' | cut -d ' ' -f5 | tail -n +2 | tr '\n' +)0))"
(これはファイルがデバイスファイルではなく、出力にls -l
5番目の列のサイズではなく、デバイスのキー番号があると仮定します。)
ls -l
or の出力はロケールごとに異なり、ls -n
/ 以外のロケールでは指定されません。C
POSIX
また、そうでない場合は、-q
名前またはシンボリックリンクターゲットに改行文字が含まれているファイルでは機能しません。
使用しないと、ランダムな-q
コマンド注入の脆弱性が発生します。誰かが悪意のある名前のファイルを生成する可能性のあるディレクトリからコマンドを実行しますln -s $'\nx x x x a[$(reboot)0]' x
か-q
?
-n
空白文字を含めることができるIDではなく、ユーザー/グループ名を取得しようとしています。-l
-l
廃止tail +2
予定です。標準構文はですtail -n +2
。
答え2
「file.txt」というファイルに番号を入力し、
var=$(cat file.txt)
echo $((${var//$'\n'/+}))
基本的に不整脈表現のパターンは
${parameter//find/replace}
、または私たちの場合${var// /+}
。これはBash パラメータ拡張:
- `\n` will add blank spaces between the numbers in the list
- The double slashes `//` are for replacing all occurrences of space with `+` sign, if you put one slash `/`, only first space is going to be replaced. The space is there because you are replacing space with plus sign.
以前の解決策は次のように単純化できます。
var=echo $(< file.txt)
echo $((${var// /+}))
しかし、どちらのソリューションも次の問題を抱えています。コマンドの置き換え末尾の改行文字が切り捨てられることがあります。
もっとここ
答え3
貼り付けとBCを使用してください。
$ paste -sd + file | bc
12283035
答え4
Bashを使った$(( ))
算術演算:
ACC=0
for i in $(command to get sizes); do ACC=$((i + ACC)); done
echo $ACC