Jeśli wiesz, że bieżący katalog zawiera co najmniej jeden nie ukryty plik:
set -- *; echo "$#"
Można to oczywiście uogólnić na dowolny glob.
W skrypcie ma to czasami niefortunny efekt uboczny nadpisania parametrów pozycyjnych. Można obejść ten problem, używając podpowłoki lub funkcji (wersja Bourne / POSIX), takiej jak:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Alternatywnym rozwiązaniem jest $(ls -d -- * | wc -l). Jeśli glob jest *, polecenie można skrócić $(ls | wc -l). Analiza wyniku lszawsze powoduje, że jestem niespokojny, ale tutaj powinien on działać tak długo, jak długo twoje nazwy plików nie zawierają znaków nowej linii, lub twoje znaki lsucieczki. I $(ls -d -- * 2>/dev/null | wc -l)ma tę zaletę, że z wdziękiem obsługuje przypadek niepasującego globu (tzn. Zwraca 0 w tym przypadku, podczas gdy set *metoda wymaga skomplikowanego testowania, czy glob może być pusty).
Jeśli nazwy plików mogą zawierać znaki nowego wiersza, można zastosować alternatywę $(ls -d ./* | grep -c /).
Każde z tych rozwiązań, które opiera się na przekazaniu rozszerzenia globu, lsmoże zawieść z powodu zbyt długiego błędu listy argumentów, jeśli istnieje wiele pasujących plików.