for ループの出力を合計し、合計を出力する単純な awk ステートメントを追加して、edmondscommerce の回答を適合させました (Mb に変換するために 1024*1024 で除算)
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr | awk ' {tot = tot+$1; print } END{ printf("%.2fMb\n",tot/(1024*1024)) }'
--porcelain は、git リポジトリのルートからの相対パス名を出力することに注意してください。したがって、サブディレクトリでこれを行うと、du ステートメントはファイルを見つけることができません..
(おっと; SoF での私の最初の答え、力がありますように)
スペースを含むファイルがクラッシュしたため、これを修正したバージョンを使用しました。サイズの計算もわからず、無駄な head
を削除しました :
git status --porcelain | sed 's/^...//;s/^"//;s/"$//' | while read path; do
du -bs "$path" ;
done | sort -n | awk ' {tot = tot+$1; print } END { printf("%.2fMB\n",tot/(1024*1024)) }'
while
を使用することを好みます for
よりも少し安全なので :改行を含むファイルで厄介なことを行うことができるので、 null
を渡す必要があることを望みます -個別のファイルを取得してもステータスを grep で取得できますが、適切な方法が見つかりませんでした。
自分の質問に答えたと思います:
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
しかし、私はより良いアイデアや便利なトリックを受け入れます。私の現在の出力は13GBです:)
上記のコマンドは基本的にそこにあります。git status から行ごとに合計が表示されますが、合計は表示されません。現在、最後にすべてのファイルの合計を取得していますが、これは正しくありません。 bc
を使ってみた しかし、それを機能させることができませんでした