Ich habe einen Git-Alias hinzugefügt, um die Zeilenanzahl bestimmter Dateien in meinem Verlauf zu ermitteln:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
Es werden jedoch wc -l
mehrere Summen gemeldet, sodass, wenn ich mehr als ~ 100.000 Zeilen habe, die Gesamtsumme für diese gemeldet wird und dann fortgefahren wird. Hier ist ein Beispiel:
<100k Zeilen (gewünschte Ausgabe)
$ 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
> 100k Leitungen (mussten umleiten grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
Wie erhalte ich eine echte Summe wc -l
, nicht eine Reihe von Zwischensummen?
xargs
, nichtwc
. Ich bin immer noch daran interessiert, wie das Problem behoben werden kann, und ich sehe in den Antworten keine gute Lösung.wc
Unterstützt Ihre Version die--files0-from
Option? Dann können Sie{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Antworten:
Versuchen Sie dies und entschuldigen Sie, dass Sie offensichtlich sind:
oder mit git:
Wenn die Ausgabe tatsächlich wie eine
wc
Ausgabe mit einzelnen Zählern und einer Summe aussehen soll , können Sieawk
die einzelnen Zeilen folgendermaßen addieren:Das wird nicht so gut aussehen wie
wc
es ist, falls es Ihnen wichtig ist. Dazu müssen Sie die gesamte Eingabe lesen und speichern, die Gesamtsumme berechnen und dann die Gesamtsumme verwenden, um die Feldbreite zu berechnen, bevor Sie diese Feldbreite zum Drucken einer formatierten Ausgabe der gespeicherten Zeilen verwenden. Wie bei Renovierungsprojekten werdenawk
Skripte nie wirklich fertiggestellt.(Hinweis für begeisterte Redakteure: Der reguläre Ausdruck in der ersten
awk
Bedingung ist für den Fall, dass es eine Datei gibt, deren Name mit "total" und einem Leerzeichen beginnt. Andernfalls hätte die Bedingung viel einfacher sein können$2 == "total"
.)quelle
git ls-files -z ${1} | xargs -0 cat | wc -l
). Ich vermisse jedoch die Zeilenanzahl pro Datei, die wc -l wie in meinem ersten Beispiel oben bereitstellt. Wie kann man hier das Beste aus beiden Welten herausholen?grep -v
, um die Gesamtsumme zu löschen, und einmal so, wie ich es vorschlage, um die Gesamtsumme zu erhalten. Oder Sie könnten die awk-Lösung in der bearbeiteten Antwort versuchen,git ls-files -z ${1} | xargs -0 wc -l | awk '/^[[:space:]]*[[:digit:]]+[[:space:]]+total$/{next} {total+=$1;print} END {print "\n Total:",total,"lines"}'
Wenn Sie Linux verwenden,
wc
stammt Ihr Betriebssystem wahrscheinlich von GNU Coreutils und hat die--files0-from
Option, eine Datei (oder stdin) zu lesen, die eine beliebig lange Liste von NUL-terminierten Dateinamen enthält, die gezählt werden sollen. In der GNU Coreutils wc-Dokumentation heißt es: "Dies ist nützlich, wenn die Liste der Dateinamen so lang ist, dass sie eine Beschränkung der Befehlszeilenlänge überschreitet. In solchen Fällen ist es unerwünscht, wc über xargs auszuführen, da die Liste in Teile aufgeteilt und wc gedruckt wird eine Summe für jede Unterliste und nicht für die gesamte Liste. "Also versuche folgendes:
Bearbeiten: Da Sie
wc
aus dem letzten Jahrtausend stammen und diese Option nicht haben, ist dies eine portablere Lösung, vorausgesetzt, Sie habenawk
und haben keine Dateien mit dem Namen "total". Es wird die Ausgabe von gefiltertwc
, alletotal
Zeilen weggelassen und stattdessen summiert und die Gesamtsumme am Ende ausgedruckt.Eine Sache, die ich nicht weiß, ist, ob die
git
Alias-Implementierung Probleme mit den$1
und$2
in einfachen Anführungszeichen haben wird, die unverändert übergeben werden müssenawk
.quelle
xargs
undwc
du rennst von Cygwin? Können Sie die Ausgabe von einfügenwc --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
.Das Problem besteht
xargs
darin, dass der Befehl in mehrere Läufe aufgeteiltwc
wird und die Gesamtsumme jedes Mal gemeldet wird. Sie haben ein paar Optionen, Sie können die Dinge so lassen, wie sie sind, und diewc
Ausgabe analysieren :Sie könnten die Dateien durchsuchen:
Oder Sie könnten
xargs
insgesamt überspringen (von hier angepasst ):Das wird jedoch scheitern, wenn Ihre Dateiliste länger als ARG_MAX ist .
quelle
quelle