Ho adattato la risposta di edmondscommerce aggiungendo una semplice istruzione awk che somma l'output del ciclo for e stampa la somma (divisa per 1024*1024 per convertirla in Mb)
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)) }'
Si noti che --porcelain stampa i percorsi relativi alla radice dei repository git. Quindi, se lo fai in una sottodirectory, l'istruzione du non sarà in grado di trovare i file..
(whoppa; la mia prima risposta in SoF, che la forza sia con essa)
Ho usato una versione modificata di questo, perché avevo file con spazi che lo facevano andare in crash. Inoltre, non ero sicuro dei calcoli delle dimensioni e ho rimosso un inutile 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)) }'
Preferisco usare while
poiché è leggermente più sicuro di for
:può ancora fare cose brutte con i file che contengono newline, quindi vorrei che ci fosse un null
da superare -separare i file ma essere ancora in grado di eseguire il grep per lo stato, ma non sono riuscito a trovare un modo carino per farlo.
Penso di aver risposto alla mia stessa domanda:
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
Tuttavia sono aperto a idee migliori o trucchi utili. Il mio output attuale è di 13 GB :)
Il comando sopra è praticamente lì, mi dà il totale riga per riga dallo stato git ma non mi dà la somma totale. Attualmente sto ricevendo il totale di tutti i file alla fine che non è corretto. Ho provato a usare bc
ma non sono riuscito a farlo funzionare