Якщо вам відомо, що поточний каталог містить принаймні один не прихований файл:
set -- *; echo "$#"
Це, очевидно, узагальнюється для будь-якого світу.
У сценарії це іноді невдалий побічний ефект перезапису позиційних параметрів. Ви можете обійти це за допомогою допоміжної оболонки або з функцією (версія Bourne / POSIX), наприклад:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Альтернативне рішення - це $(ls -d -- * | wc -l)
. Якщо глобус є *
, команду можна скоротити до $(ls | wc -l)
. Розбір результатів ls
завжди викликає занепокоєння, але тут він повинен працювати до тих пір, поки імена ваших файлів не містять нових рядків, або якщо ви ls
їх уникаєте. І $(ls -d -- * 2>/dev/null | wc -l)
має перевагу граціозно керувати випадком невідповідного глобу (тобто він повертає 0 у такому випадку, тоді як для цього set *
методу потрібно чітко перевірити, чи глобул може бути порожнім).
Якщо імена файлів можуть містити символи нового рядка, слід використовувати альтернативу $(ls -d ./* | grep -c /)
.
Будь-яке з тих рішень, які покладаються на передачу розширення глобулу, ls
може не працювати зі списком аргументів занадто довгою помилкою, якщо є багато файлів відповідності.