Опция -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
следующим образом:
Форсировать каждый аргументбыть интерпретированным как каталог и перечислить имя, найденное в каждом слоте.Эта опция должна отключить -l
, -t
, -s
и -r
и включить -a
;порядок - это порядок, в котором записи появляются в каталоге.
Такие команды, как ls|wc -l
, дают неверный результат, когда имена файлов содержат символы новой строки.
В zsh вы можете сделать что-то подобное:
a=(*(DN));echo ${#a}
D
(glob_dots
) включает в себя файлы, имена которых начинаются с точки, а N
(null_glob
) приводит к тому, что команда не приводит к ошибке в пустом каталоге.
Или то же самое в bash:
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
в bash или glob_dots
в zsh.Когда *
не соответствует ни одному файлу, команда приводит к ошибке в zsh с настройками по умолчанию.