-U
вариант для ls
нет в POSIX, и в OS X. В ls
имеет иной смысл GNU ls
, которая является то, что она делает -t
и -l
раз создание использования вместо модификация раз. -f
находится в POSIX как расширение XSI. Руководство GNU ls
описывает -f
как do not sort, enable -aU, disable -ls --color
и -U
как do not sort; list entries in directory order
.
POSIX описывает -f
как это:
Force каждый аргумент должен интерпретироваться как каталог и список имя, найденное в каждом слоте. Этот вариант должен отключить -l
, -t
, -s
и -r
и включить -a
; порядок - это порядок, в котором записи появляются в каталоге.
Такие команды, как ls|wc -l
, приводят неверный результат, когда имена файлов содержат символы новой строки.
В Zsh вы можете сделать что-то вроде этого:
a=(*(DN));echo ${#a}
D
(glob_dots
) включает в себя файлы, имена которых начинаются с периода и N
(null_glob
) приводит к тому, команда не приводит к ошибке в пустой каталог ,
Или же в Баш:
shopt -s dotglob nullglob;a=(*);echo ${#a[@]}
Если IFS
содержит ASCII цифры, добавить двойные кавычки ${#a[@]}
. Добавьте shopt -u failglob
, чтобы убедиться, что failglob
не установлен.
портативный вариант заключается в использовании find
:
find . ! -name . -prune|grep -c/
grep -c /
может быть заменен wc -l
, если имена файлов не содержат символы новой строки. ! -name . -prune
- переносная альтернатива -mindepth 1 -maxdepth 1
.
Или вот еще одна альтернатива, которая обычно не включают в себя файлы, имена которых начинаются с периода:
set -- *;[ -e "$1" ]&&echo "$#"
Команда выше тем не менее включает файлы, имена которых начинаются с периода, когда вариант как dotglob
в Баш или glob_dots
в zsh. Когда *
не соответствует файлу, команда приводит к ошибке в zsh с настройками по умолчанию.
Какая часть насчет 'ls | wc -l' не O (1)? – halfdan
ls | wc -l заставит ls делать opendir(), readdir() и, вероятно, stat() для всех файлов. Обычно это будет как минимум O (n). – MarkR
@halfdan: ls выводит все файлы, так что это O (n) – yassin