Używam narzędzia wc w skrypcie powłoki, który uruchamiam z Cygwin, i zauważyłem, że istnieje więcej niż jedna linia z "całkowitą" w jej wyniku.Dlaczego narzędzie wc generuje wiele linii z "całkowitą"?
Poniższa funkcja służy do policzyć liczbę wierszy w moich plikach źródłowych:
count_curdir_src() {
find . '(' -name '*.vb' -o -name '*.cs' ')' \
-a '!' -iname '*.Designer.*' -a '!' -iname '.svn' -print0 | \
xargs -0 wc -l
}
Ale jego wyjście do pewnego katalogu wygląda następująco:
$ find . '(' -name '*.vb' -o -name '*.cs' ')' -a '!' -iname '*.Designer.*' -a '!' -iname '.svn' -print0 | xargs -0 wc -l
19 ./dirA/fileABC.cs
640 ./dirA/subdir1/fileDEF.cs
507 ./dirA/subdir1/fileGHI.cs
2596 ./dirA/subdir1/fileJKL.cs
(...many others...)
58 ./dirB/fileMNO.cs
36 ./dirB/subdir1/filePQR.cs
122200 total
6022 ./dirB/subdir2/subsubdir/fileSTU.cs
24 ./dirC/fileVWX.cs
(...)
36 ./dirZ/Properties/AssemblyInfo.cs
88 ./dirZ/fileYZ.cs
25236 total
Wygląda wc resetuje gdzieś w tym procesie. Nie może być spowodowane znakami spacji w nazwach plików lub nazwach katalogów, ponieważ używam opcji -print0
. I dzieje się tak tylko wtedy, gdy uruchomię go na moim największym drzewie źródeł.
Czy to błąd w WC, czy w Cygwin? Albo coś innego? Wc podręcznika mówi:
Drukuj nowej linii, słowo, a bajt liczy dla każdego pliku, a całkowitą linię jeśli więcej niż jeden plik jest określona.
Nie wspomina nic o wielu liniach łącznych (łączna suma się liczy, czy coś), więc kto jest tutaj winny?
Dwie rzeczy: powody, dla których podział xargs jest wsadowy, można zobaczyć w 'xargs --show-limits', który pokazuje ograniczenia w twoim systemie. Możesz uniknąć tworzenia pliku za pomocą potoków i używając '--files0-from = -', który czyta ze stdin – Xavier
@Xavier: Może warto dodać własną odpowiedź z tymi informacjami. –