Я добавил псевдоним git для подсчета количества строк определенных файлов в моей истории:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
Тем не менее, wc -l
отчет о нескольких итогах, так что, если у меня есть более чем 100 000 строк, он сообщает для них итоги, а затем идет дальше. Вот пример:
<100 тыс. Строк (желаемый вывод)
$ 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 линии (пришлось трубы grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
Как получить истинную сумму wc -l
, а не ряд промежуточных итогов?
xargs
, а неwc
. Мне все еще интересно, как это исправить, и я не вижу хорошего решения в ответах.wc
поддерживает--files0-from
опцию? Тогда вы можете сделать{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Ответы:
Попробуйте это, и извинения за очевидность:
или с помощью git:
Если вы действительно хотите, чтобы выходные данные выглядели как
wc
выходные, с индивидуальными подсчетами и суммой, вы можете использоватьawk
для суммирования отдельных строк:Это не будет выстроено так хорошо, как
wc
в случае, если это важно для вас. Чтобы сделать это, вам нужно прочитать весь ввод и сохранить его, вычисляя итоговое значение, а затем использовать итоговое значение для вычисления ширины поля, прежде чем использовать эту ширину поля для печати форматированного вывода запомненных строк. Как и проекты по реконструкции дома,awk
сценарии никогда не заканчиваются.(Примечание для редакторов-энтузиастов: регулярное выражение в первом
awk
условии есть в случае, если существует файл, имя которого начинается с «total» и пробела; в противном случае условие могло бы быть намного проще$2 == "total"
.)источник
git ls-files -z ${1} | xargs -0 cat | wc -l
). Тем не менее, мне не хватает количества строк в файле, которое предоставляет wc -l, как в моем первом примере выше. Любой способ получить лучшее из обоих миров здесь?grep -v
чтобы отбросить общее количество строк, и один раз, как я предлагаю получить общее количество. Или вы можете попробовать решение awk в отредактированном ответеgit ls-files -z ${1} | xargs -0 wc -l | awk '/^[[:space:]]*[[:digit:]]+[[:space:]]+total$/{next} {total+=$1;print} END {print "\n Total:",total,"lines"}'
Если вы работаете в Linux, вы,
wc
вероятно, исходите из GNU Coreutils и--files0-from
можете прочитать файл (или stdin), содержащий произвольно длинный список имен файлов, заканчивающихся NUL, для подсчета. В документации GNU Coreutils wc сказано: «Это полезно, когда список имен файлов настолько велик, что может превышать ограничение длины командной строки. В таких случаях запуск wc через xargs нежелателен, поскольку он разбивает список на части и делает вывод wc итого по каждому подсписку, а не по всему списку. "Так что попробуйте это:
Изменить: так как ваш
wc
с прошлого тысячелетия и не имеет этой опции, вот более портативное решение, если у вас естьawk
и нет файлов с именем «всего». Он отфильтрует выходные данныеwc
, пропустив любыеtotal
строки, суммируя их и распечатав итоговую сумму в конце.Одна вещь, которую я не знаю, это то,
git
будут ли у реализации псевдонима проблемы с одиночными кавычками$1
и$2
внутри, которые нужно передать без измененийawk
.источник
xargs
иwc
ты бежишь от Cygwin? Можете ли вы вставить выводwc --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
.Проблема в том,
xargs
что команда разбивается на несколько запусков, поэтомуwc
каждый раз выдает отчет об итогах. У вас есть несколько вариантов, вы можете оставить все как есть и проанализироватьwc
вывод:Вы можете просмотреть файлы:
Или вы можете
xargs
вообще пропустить (адаптировано отсюда ):Это сломается, если ваш список файлов длиннее, чем ARG_MAX .
источник
источник