Dodałem alias git, aby podać mi liczbę wierszy określonych plików w mojej historii:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
Jednak wc -l
zgłasza wiele podsumowań, tak że jeśli mam więcej niż ~ 100 tys. Linii, zgłasza ich sumę, a następnie przechodzi do następnego etapu. Oto przykład:
<100 tys. Linii (pożądana wydajność)
$ git lines \*.xslt
46 packages/NUnit-2.5.10.11092/doc/files/Summary.xslt
232 packages/NUnit-2.5.10.11092/samples/csharp/_UpgradeReport_Files/UpgradeReport.xslt
278 total
> 100 tys. Linii (do potoku grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
Jak uzyskać prawdziwą sumę wc -l
, a nie serię sum częściowych?
xargs
, że niewc
. Nadal jestem zainteresowany tym, jak to naprawić i nie widzę dobrego rozwiązania w odpowiedziach.wc
obsługuje tę--files0-from
opcję? Potem możesz zrobić{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Odpowiedzi:
Spróbuj tego i przepraszamy za oczywistość:
lub z git:
Jeśli naprawdę chcesz, aby dane wyjściowe wyglądały jak
wc
dane wyjściowe, z indywidualnymi liczbami i sumą, możesz użyćawk
do zsumowania poszczególnych linii:To nie będzie tak ładnie ustawione, jak
wc
to, w przypadku, gdy jest to dla Ciebie ważne. Aby to zrobić, musisz przeczytać cały zapis i zapisać go, obliczając sumę, a następnie użyć sumy do obliczenia szerokości pola przed użyciem tej szerokości do wydrukowania sformatowanego wyjścia zapamiętanych linii. Podobnie jak projekty remontów domowych,awk
skrypty nigdy nie są tak naprawdę ukończone.(Uwaga dla entuzjastycznych redaktorów: wyrażenie regularne w pierwszym
awk
warunku występuje w przypadku, gdy istnieje plik, którego nazwa zaczyna się od „total” i spacji; w przeciwnym razie warunek mógłby być znacznie prostszy$2 == "total"
.)źródło
git ls-files -z ${1} | xargs -0 cat | wc -l
). Brakuje mi jednak liczby wierszy na plik, jaką zapewnia wc -l, tak jak w moim pierwszym przykładzie powyżej. Jakiś sposób, aby uzyskać to, co najlepsze z obu światów tutaj?grep -v
aby upuścić całkowitą liczbę wierszy, a raz tak, jak sugeruję, aby uzyskać całkowitą sumę. Możesz też wypróbować rozwiązanie awk w edytowanej odpowiedzi,git ls-files -z ${1} | xargs -0 wc -l | awk '/^[[:space:]]*[[:digit:]]+[[:space:]]+total$/{next} {total+=$1;print} END {print "\n Total:",total,"lines"}'
Jeśli używasz Linuksa,
wc
prawdopodobnie pochodzi on z GNU Coreutils i ma--files0-from
opcję odczytu pliku (lub standardowego) zawierającego dowolnie długą listę nazw plików zakończonych przez NUL, które mają być policzone. Dokumentacja WC GNU Coreutils mówi: „Jest to przydatne, gdy lista nazw plików jest tak długa, że może przekraczać ograniczenie długości wiersza poleceń. W takich przypadkach uruchomienie wc przez xargs jest niepożądane, ponieważ dzieli listę na części i powoduje wydrukowanie wc suma dla każdej podlisty zamiast dla całej listy ”.Spróbuj tego:
Edycja: Ponieważ twoje
wc
pochodzi z ostatniego tysiąclecia i nie ma tej opcji, oto bardziej przenośne rozwiązanie, zakładając, że maszawk
i nie masz żadnych plików o nazwie „total”. Przefiltruje wynikwc
, pomijając dowolnetotal
wiersze i zamiast tego sumując je i wypisując całkowitą sumę na końcu.Nie wiem, czy
git
implementacja aliasu będzie miała problemy z pojedynczymi cudzysłowami$1
i$2
wewnątrz, które należy przekazać bez zmianawk
.źródło
xargs
iwc
ty biegniesz z Cygwin? Czy możesz wkleić wynikwc --version
?$ wc --version wc (GNU textutils) 2.0 Written by Paul Rubin and David MacKenzie. Copyright (C) 1999 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\Program Files (x86)\Git\bin\wc.exe
--files0-from
.Problem polega na
xargs
tym, że polecenie dzieli się na wiele przebiegów, więcwc
raportuje sumę za każdym razem. Masz kilka opcji, możesz zachować rzeczy takimi, jakie są i przeanalizować danewc
wyjściowe:Możesz cat plików:
Lub możesz
xargs
całkowicie pominąć (dostosowany tutaj ):To się zepsuje, jeśli twoja lista plików jest dłuższa niż ARG_MAX .
źródło
źródło