Viac na
Ako môžem získať počet súborov v adresári pomocou príkazového riadku?
Mám adresár s veľkým počtom súborov. Nevidím prepínač ls
, ktorý by poskytol počet. Existuje nejaké kúzlo príkazového riadku na získanie počtu súborov?
195
3
Použitie širokej definície pojmu "súbor"
(všimnite si, že nepočíta so skrytými súbormi a predpokladá, že názvy súborov neobsahujú znaky nového riadku).
Ak chcete zahrnúť skryté súbory (okrem
.
a..
) a vyhnúť sa problémom so znakmi nového riadku, kanonický spôsob je:Alebo rekurzívne:
Pre užšiu definíciu súboru:
Ak viete, že aktuálny adresár obsahuje aspoň jeden neskrytý súbor:
Toto je samozrejme možné zovšeobecniť na akýkoľvek glob.
V skriptoch to má niekedy nešťastný vedľajší účinok v podobe prepísania pozičných parametrov. Môžete to obísť použitím podskupiny alebo pomocou funkcie (verzia Bourne/POSIX), ako napr:
Alternatívnym riešením je
$(ls -d -- * | wc -l)
. Ak je glob*
, príkaz sa dá skrátiť na$(ls | wc -l)
. Rozbor výstupu príkazuls
ma vždy znepokojuje, ale tu by to malo fungovať, pokiaľ názvy súborov neobsahujú nové riadky, alebo ich vášls
escapuje. A$(ls -d -- * 2>/dev/null | wc -l)
má tú výhodu, že sa elegantne vysporiada s prípadom nezhodného globu (t. j. v takom prípade vráti 0, zatiaľ čo metódaset *
vyžaduje zložité testovanie, či glob môže byť prázdny).Ak názvy súborov môžu obsahovať znaky nového riadku, alternatívou je použitie
$(ls -d ./* | grep -c /)
.Každé z týchto riešení, ktoré sa spoliehajú na odovzdanie rozšírenia globu do
ls
, môže zlyhať s chybou argument list too long (zoznam argumentov je príliš dlhý), ak je veľa vyhovujúcich súborov.