Как посчитать количество файлов в командной строке Unix-like систем?



Сегодня у меня в голове возник, казалось бы, простой вопрос: «Как посчитать количество файлов/папок в консоли unix-like систем?». С linux’ом у меня крайне мало опыта работы, поэтому вот сходу ответ придумать решение не смог (позор!!!). Хотел было уже на все это положить железный болт, но моя любознательность взяла свое, и решил я подключиться на наш сервер, работающий под FreeBSD. Уж больно захотелось быстрых экспериментов. Что из этого получилось – читай дальше.

Итак, SSH клиент задорно мигнул и представил моему взору голую консоль бзди. Вообще, у нас на работе всеми животными (linux’ами) и адскими созданиями (freebsd) рулит Lord_of_fear. Я знал, что lord непременно знает ответ на мучивший меня вопрос, но решил попытаться дойти до решения самостоятельно.

Сначала я думал, что мою скромную потребность может удовлетворить команда ls. Тыкал и так и сяк, но, то, что мне, было, нужно не нашел. Почему я подумал на ls? Да потому что с помощью ls выдает список файлов и папок запрашиваемого каталога в разных представлениях. Мне как человеку с отсутствием должного опыта показалось логично, что операция как подсчет файлов полюбас должна быть организована. Увы, я ошибся. Ну, ничего, стал ковырять дальше.

А дальше было самое интересное. Я вспомнил, что есть такая команда как wc. Для тех кто не в курсе рассказываю. При помощи wc можно посчитать количество символов/строк (ключ l) /байт и т.д. Немного пошевелив извилинами, мой мозг сгенерировал следующее решение:

rod$: ls | wc –l

Команда тут же выплюнула мне число 22. Эксперимент удался. Я получил число файлов и каталогов текущей директории. Цель вроде была достигнута, но тут я решил, что было бы здорово получить именно количество файлов, т.е. без учета директорий. Стал опять крутить вертеть комбинацию и докрутил до следующего вида:

rod$: ls -l | grep ^- | wc -l

Команда успешно выполнилась и показала мне количество файлов. О том, как это работает я расскажу чуть ниже, а пока продемонстрирую подсчет количества директорий:

rod$: ls -l | grep ^d |wc -l

Я не ошибся, команда опять выдала верный результат. Теперь я был полностью доволен. Ответ на вопрос получил, но мне все, же захотелось сделать еще один тест. На этот раз я решил посчитать количество файлов с определенным расширением. Думать уже не пришлось. Всего лишь изменил команду до вида:

rod$: ls –l|grep php|wc -l

Как и следовало ожидать, в этот раз, команда также выполнилась без ошибок. Теперь немного отвлечемся и попробуем разобраться, что же я здесь такого написал. Итак, начнем с команды ls c параметром l. Сама команда ls в мире Unix предназначена для получения списка файлов/папок определенной директории. Если при вызове этой команды указать параметр l, то для каждого файла/папки будет выведена дополнительная информация. Под дополнительной информацией я подразумеваю дату, размер файла, права доступа и т.д.

Пример вывода информации при помощи команды ls с ключом l я показал на рисунке. Присмотрись внимательно к рисунку. Если ты не разбираешься в unix-like системах, то советую обратить пристальное внимание на самую первую колонку. В ней расписаны права доступа. Первый символ (-) перед маской прав означает, что это именно файл. Буква d наоборот, дает нам четко понять, что это - каталог. Выходит, для определения количества файлов в директории, нам всего лишь нужно посчитать строки, выведенные с помощью команды ls –l, у которых первый символ тире (-).

Для решения этой задачи я использую команду grep. Саму команду grep я вызываю в той же строке, где и ls. После команды ls –l я указываю символ |, который означает, что результат выполнения команды (ls –l) нужно передать в качестве параметра для команды, указанной после вертикальной черты. Надеюсь, с этим моментом все понятно. Двигаемся дальше.

Сама команда grep предназначена для осуществления поиска текста в файлах. В нашем случае эта команда будет использоваться для отбора строк, которые начинаются с символа (-). Мы знаем, что поиск нужно производить именно сначала строки (т.е. проверять именно первый символ), а раз так, то введем для grep уточнение. В мире unix-like сделано все очень гибко и было бы странным, если в grep отсутствовала поддержка регулярных выражений. Она есть, и грех ей не воспользоваться. Для решения этой задачи воспользуемся конструкцией: ^-. Те, кто еще не начинал учить регулярки, объясняю. Это выражение говорит о том, что первым символом должен быть именно -. Таким же алгоритмом я пользуюсь для подсчета количества директорий. Только на этот раз вместо символа -, я указываю букву d (directory). Думаю, про пример с подсчетом количества файлов с расширением php уже пояснять не нужно.

Outro

Вот так просто можно посчитать количество файлов/папок в ужасной и страшной консоли unix-like систем. Удачи!

Written by Игорь Антонов aka Spider_NET
E-mail/jabber:
twitter: ]]>http://twitter.com/antonovi]]>
www: ]]>http://vr-online.ru]]>
skype: antonov_i

Комментарии

4 комментария(ев)
аватар: blabla13
blabla13
Дата: Втр, 12/10/2010 - 01:34
Звание: Наблюдатель
Сообщений: 1

Подсчет файлов включая подкаталог: ls -l -R|grep ^-|wc -l

аватар: Spider_NET
Spider_NET
Дата: Втр, 12/10/2010 - 19:35
Звание: Мастер
Сообщений: 2455

Спасибо за дополнение!

аватар: Ghost Rider
Ghost Rider
Дата: СБ, 08/01/2011 - 06:02
Звание: Посвященный
Сообщений: 408

2 Spider_NET Спасибо! будем знать.

аватар: Pupkin
Pupkin
Дата: СР, 18/04/2012 - 05:47
Звание: Наблюдатель
Сообщений: 1

Цитировать

ls –l|grep php|wc -l

А не проще ли:
ls -l *.php | wc -l
Зачем вызывать grep, когда эту же операцию можно выполнить при помощи ls?

А ещё можно было бы разрешить отправлять сообщения не авторизованным, а то не очень-то приятно ради одного сообщения проходить нудную регистрацию. Да ивам это не выгодно. Лишняя запись в БД вам вряд ли нужна.
Для защиты от спама можно сделать премодерацию. Пользователю-то пофиг есть премодерация или нет, а регистрироваться вряд ли кто-то захочет, а значит некоторая масса посетителей уходят не оставив даже следа своего присутствия.