Adapté la respuesta de edmondscommerce agregando una instrucción awk simple que suma la salida del bucle for e imprime la suma (dividida por 1024*1024 para convertir a 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)) }'
Tenga en cuenta que --porcelain imprime nombres de ruta en relación con la raíz de los repositorios de git. Entonces, si hace esto en un subdirectorio, la instrucción du no podrá encontrar los archivos.
(vaya; mi primera respuesta en SoF, que la fuerza lo acompañe)
He usado una versión modificada de esto, porque tenía archivos con espacios que hacían que fallara. Tampoco estaba seguro de los cálculos de tamaño y eliminé un head
inútil :
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)) }'
Prefiero usar while
ya que es un poco más seguro que for
:todavía puede hacer cosas desagradables con archivos que tienen saltos de línea, así que desearía que hubiera un paso null
-Separe los archivos y aún pueda buscar el estado, pero no pude encontrar una buena manera de hacerlo.
Creo que he respondido mi propia pregunta:
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
Sin embargo, estoy abierto a mejores ideas o trucos útiles. Mi salida actual es de 13 GB :)
El comando anterior está básicamente ahí, me da el total línea por línea del estado de git pero no me da la suma total. Actualmente obtengo el total de todos los archivos al final, lo cual no es correcto. Probé algún uso de bc
pero no pude hacerlo funcionar