Если синтаксический анализ выходных данных ls
опасен, поскольку он может разбиваться на некоторые забавные символы (пробелы \n
, ...), каков наилучший способ узнать количество файлов в каталоге?
Я обычно полагаюсь на то, find
чтобы избежать этого анализа, но, аналогично, find mydir | wc -l
сломается по тем же причинам.
Я сейчас работаю над Solaris, но я ищу ответ, который был бы более разборчивым для разных юнитов и разных оболочек.
find
получит рекурсивное количество файлов (используйте,-maxdepth 1
если вы этого не хотите.find mydir -maxdepth 1 -type f -printf \\n | wc -l
должны обрабатывать специальные символы в имени файла, так как они никогда не печатаются в первую очередь.Ответы:
Как насчет этого трюка?
Такой же портативный, как
find
иwc
.источник
n+1
в моей системе Debian отображаются файлы). Он также не фильтрует обычные файлы.find
команду к вашим конкретным потребностям. Да, этот включает в себя все каталоги, в том числе.
(возможно, поэтому вы видите результат какn+1
).find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; некоторые старые версииfind
не имеют-not
.-maxdepth
это не стандарт (расширение GNU теперь также поддерживается несколькими другими реализациями).С Bash, без внешних утилит, ни петли:
В кш заменить
shopt -s dotglob
наFIGNORE=.?(.)
. В zsh замени егоsetopt glob_dots
или убериshopt
звонок и используйfiles=(*(D))
. (Или просто отбросьте строку, если вы не хотите включать точечные файлы.) Если вы не заботитесь о точечных файлах:Если вы хотите включить точечные файлы:
источник
1
пустой каталог, когдаnullglob
он не включен. В Zsh,a=(*(DN));echo ${#a}
сN
(nullglob
) Классификатор не приводит к ошибке для пустого каталога.Должен быть достаточно переносимым для систем после 80-х годов.
Это считает все записи каталога, кроме
.
и..
в текущем каталоге.Для подсчета файлов в подкаталогах также:
(что нужно переносить даже на Unix V6 (1975), так как это не нужно
-prune
)источник
find dirname ! -name dirname -prune -print
). С тех пор я задавался вопросом, есть ли какая-либо конкретная причина для использованияgrep -c /
вместоwc -l
(которая, вероятно, чаще используется для подсчета).find dirname ! -name dirname
не работает, если есть другие каталоги с именамиdirname
. Это лучше использоватьfind dirname/. ! -name .
.wc -l
подсчитывает количество строк, имена файлов могут состоять из нескольких строк, так как символ новой строки так же действителен, как и любой в имени файла.Пытаться:
В нем
-b
будут непечатаемые символы,-A
будут показаны все файлы, кроме.
и..
одного, и по одному на строку (по умолчанию для канала, но хорошо, если это будет явно).Пока мы включаем языки сценариев более высокого уровня, в Python есть одна строка:
Или с полным «найти»:
источник
Йок может использовать такую конструкцию:
Но я боюсь, вы можете получить ошибку, как
Argument list too long.
в случае, если у вас слишком много файлов в каталоге. Однако я проверил его в каталоге с 10 миллиардами файлов, и он работал хорошо.источник
*
.gnu find . -maxdepth 1 -type f | wc -l
for
.Рассматривали ли вы Perl, который должен быть относительно портативным?
Что-то типа:
источник
Попробуйте это => Использование ls с опциями -i (для номера узла) и -F (добавляет имя каталога с помощью '/').
источник
С
perl
однострочником (переформатировано для удобства чтения):или
Вы можете использовать
perl
функции, которые изменяют массивы какgrep
илиmap
со второй версией. Смотритеperldoc -f readdir
пример использованияgrep
.источник
Самая простая версия, которую я использую все время и с которой никогда не было проблем:
ls -b1 | wc -l
источник
\n
или несколько символов в стиле фанк (да, некоторые юниты допускают это).В дополнение к
find
основанному на Стефане ответу на основе ниже приведен POSIX-совместимый ответ, основанный наls
:источник