Wenn Sie wissen, dass das aktuelle Verzeichnis mindestens eine nicht ausgeblendete Datei enthält:
set -- *; echo "$#"
Dies ist offensichtlich für jeden Glob verallgemeinerbar.
In einem Skript hat dies den manchmal unglücklichen Nebeneffekt, dass die Positionsparameter überschrieben werden. Sie können das umgehen, indem Sie eine Subshell oder eine Funktion (Bourne / POSIX-Version) wie folgt verwenden:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Eine alternative Lösung ist $(ls -d -- * | wc -l)
. Wenn das Glob ist *
, kann der Befehl auf gekürzt werden $(ls | wc -l)
. Das Parsen der Ausgabe von ls
macht mir immer unangenehm, aber hier sollte es funktionieren, solange Ihre Dateinamen keine Zeilenumbrüche enthalten oder Sie ls
sie maskieren . Und $(ls -d -- * 2>/dev/null | wc -l)
hat den Vorteil, dass der Fall eines nicht übereinstimmenden Glob ordnungsgemäß behandelt werden kann (dh, in diesem Fall wird 0 zurückgegeben, wohingegen bei der set *
Methode sorgfältig geprüft werden muss, ob der Glob möglicherweise leer ist).
Wenn Dateinamen Zeilenumbrüche enthalten können, können Sie auch eine Alternative verwenden $(ls -d ./* | grep -c /)
.
Jede dieser Lösungen, die darauf angewiesen sind, die Erweiterung eines Glob zu übergeben, schlägt ls
möglicherweise mit einer zu langen Argumentliste fehl, wenn viele übereinstimmende Dateien vorhanden sind.