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 ls
zawsze 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 ls
ucieczki. 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, ls
może zawieść z powodu zbyt długiego błędu listy argumentów, jeśli istnieje wiele pasujących plików.