Zależy to głównie od twojej wersji jądra Linux.
Powinieneś być w stanie zobaczyć limit swojego systemu, uruchamiając
getconf ARG_MAX
która określa maksymalną liczbę bajtów, jaką wiersz poleceń może mieć po rozwinięciu przez powłokę.
W Linuksie <2.6.23 limit wynosi zwykle 128 KB.
W Linuksie> = 2.6.25 limit wynosi 128 KB lub 1/4 wielkości stosu (patrz ulimit -s
), w zależności od tego, która wartość jest większa.
Zobacz stronę manuala execve (2), aby poznać wszystkie szczegóły.
Niestety, potokowanie ls *.txt
nie rozwiąże problemu, ponieważ limit jest w systemie operacyjnym, a nie w powłoce.
Powłoka rozszerza *.txt
, a następnie próbuje zadzwonić
exec("ls", "a.txt", "b.txt", ...)
i masz tyle pasujących plików *.txt
, że przekraczasz limit 128 KB.
Będziesz musiał zrobić coś takiego
find . -maxdepth 1 -name "*.txt" | wc -l
zamiast.
(I zobacz poniższe komentarze Shawna J. Goffa na temat nazw plików zawierających nowe linie).
ls
wyjście „s , co jest złym pomysłem, więc lepiej unikać. Aby zliczyć, zobacz Jaki jest najlepszy sposób na policzenie liczby plików w katalogu? , w przypadku trudnego obejścia sprawdź, dlaczego dla pętli nie występuje błąd „zbyt długi argument”? .