Saya telah menambahkan alias git untuk memberi saya jumlah baris file tertentu dalam riwayat saya:
[alias]
lines = !lc() { git ls-files -z ${1} | xargs -0 wc -l; }; lc
Namun, wc -l
melaporkan beberapa total, sehingga jika saya memiliki lebih dari ~ 100 ribu baris, itu melaporkan total untuk mereka, kemudian pindah. Ini sebuah contoh:
<100rb baris (output yang diinginkan)
$ 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 garis (harus pipa ke grep "total"
)
$ git lines \*.cs | grep "total"
123569 total
107700 total
134796 total
111411 total
44600 total
Bagaimana cara mendapatkan total sebenarnya wc -l
, bukan serangkaian subtotal?
xargs
, bukanwc
. Saya masih tertarik dengan cara memperbaikinya, dan saya tidak melihat solusi yang baik dalam jawabannya.wc
mendukung--files0-from
opsi? Maka Anda bisa melakukannya{ git ls-files -z ${1} | wc -l --files0-from=- ; }
wc: unrecognized option '--files0-from=-'
Jawaban:
Coba ini, dan minta maaf karena sudah jelas:
atau, dengan git:
Jika Anda benar-benar ingin output terlihat seperti
wc
output, dengan jumlah individual dan jumlah, Anda dapat menggunakanawk
untuk menambahkan setiap baris:Itu tidak akan berbaris sebaik
wc
itu, jika itu penting bagi Anda. Untuk melakukan itu, Anda harus membaca seluruh input dan menyimpannya, menghitung total, dan kemudian menggunakan total untuk menghitung lebar bidang sebelum menggunakan lebar bidang itu untuk mencetak output terformat dari garis yang diingat. Seperti proyek renovasi rumah,awk
skrip tidak pernah benar-benar selesai.(Catatan untuk editor yang antusias: ekspresi reguler di bagian pertama
awk
kondisi adalah dalam kasus ada file yang namanya dimulai dengan "total" dan spasi; jika tidak, kondisinya bisa menjadi jauh lebih sederhana$2 == "total"
.)sumber
git ls-files -z ${1} | xargs -0 cat | wc -l
). Namun, saya kehilangan jumlah baris per file yang disediakan oleh wc -l seperti pada contoh pertama saya di atas. Adakah cara untuk mendapatkan yang terbaik dari kedua dunia di sini?grep -v
menjatuhkan garis total, dan sekali cara saya sarankan untuk mendapatkan total total. Atau Anda dapat mencoba solusi awk dalam jawaban yang diedit,git ls-files -z ${1} | xargs -0 wc -l | awk '/^[[:space:]]*[[:digit:]]+[[:space:]]+total$/{next} {total+=$1;print} END {print "\n Total:",total,"lines"}'
Jika Anda menjalankan Linux,
wc
kemungkinan Anda berasal dari GNU Coreutils dan memiliki--files0-from
opsi untuk membaca file (atau stdin) yang berisi daftar panjang nama-nama file yang diakhiri NUL untuk dihitung. The dokumentasi GNU Coreutils wc mengatakan "Hal ini berguna ketika daftar nama file begitu lama bahwa hal itu mungkin melebihi batasan perintah panjang garis. Dalam kasus tersebut, berjalan wc melalui xargs tidak diinginkan karena membagi daftar menjadi potongan-potongan dan membuat cetak wc total untuk setiap sublist daripada untuk seluruh daftar. "Jadi coba ini:
Sunting: Karena Anda
wc
berasal dari milenium terakhir dan tidak memiliki opsi itu, berikut adalah solusi yang lebih portabel, dengan asumsi Anda memilikiawk
dan tidak memiliki file bernama "total". Ini akan memfilter output dariwc
, menghilangkan semuatotal
baris dan bukannya menjumlahkannya dan mencetak total keseluruhan di akhir.Satu hal yang saya tidak tahu adalah apakah
git
implementasi alias akan memiliki masalah dengan$1
dan$2
di dalam tanda kutip tunggal, yang perlu diteruskan tidak berubahawk
.sumber
xargs
danwc
Anda menjalankan berasal dari Cygwin? Bisakah Anda menempelkan outputwc --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
.Masalahnya adalah
xargs
membagi perintah menjadi beberapa kali, sehinggawc
melaporkan total untuk setiap waktu. Anda memiliki beberapa opsi, Anda bisa menjaga semuanya tetap seperti semula dan menguraikanwc
hasilnya:Anda dapat menyimpan file-file ini:
Atau Anda dapat melewati
xargs
semuanya (diadaptasi dari sini ):Itu akan rusak jika daftar file Anda lebih panjang dari ARG_MAX .
sumber
sumber