Программы
Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Не могу отнести данный код к супер-полезным или сложным, однако, это довольно занятное упражнение: если возникает какая-то задача - решать ещё однострочником на Bash. Получается такая своеобразная гимнастика для ума. Ну и позволяет не забывать основные команды Bash.

Код ниже пройдётся по всем вложенным в текущую директорию файлам, посчитает количество строк, сложит вместе и выведет на консоль:

    find -type f -name \*.c -exec wc -l {} \; \
      | cut -d' ' -f1 \
      | while read line; do \
          res=$(($res + $line)); \
          echo $res; \
        done \
      | tail -1

Для удобства я его отформатировал, а чтобы Bash не замечал переводы строк - заэкранировал их символом \.

Начнём с первой строки:

    find -type f -name \*.c -exec wc -l {} \;

С помощью утилиты find можно рекурсивно пробежаться по директории в поисках нужных файлов. Так, к примеру, сейчас мы ищем по типу "f" - файлы (-type f), имя которых заканчивается на "*.c" (-name \*.c). При чём символ "*" нам нужно экранировать, ведь иначе Bash попытается подставить аргументом файлы, подходящие под шаблон. В нашем случае - *.с.

С помощью же ключа -exec мы также просим find для каждого файла выполнить команду. В нашем случае используем утилиту wc - wc -l - посчитать строки:

    $ find -type f -name \*.c -exec wc -l {} \;
    38 ./t/test_x.c
    45 ./t/test_y.c
    49 ./t/test_z.c
    224 ./main.c
    267 ./inc/x.c
    38 ./inc/y.c
    77 ./inc/z.c
    ...

Теперь мы имеем 2 колонки, разделённые пробелом: количество строк, имя файла.

Вторая колонка нам неинтересна, поэтому вырежем её утилитой cut:

    cut -d' ' -f1

Устанавливаем разделителем пробел (-d' '), оставляем 1-ую колонку (-f1).

Если возник вопрос о том, зачем нужна вертикальная черта между командами, подробнее - в заметке о потоках ввода-вывода. Если коротко - с помощью неё как по трубе передаём данные от одной команды к другой.

На данный момент наши данные приняли вид:

    $ find -type f -name \*.c -exec wc -l {} \; | cut -d' ' -f1
    38
    45
    49
    224
    267
    38
    77
    ...

Теперь нам нужно просуммировать строки. И здесь нам потребуется цикл while. Считываем строчку за строчкой, а в теле цикла суммируем их и выводим результат:

    res=$(($res + $line)); \
    echo $res; \

Теперь в последней строке вывода будет искомое число. Получаем его утилитой tail. Ключ указывает на то, сколько строк с конца мы хотим получить: tail -1 - получить последнюю строку.

Думаю, теперь понятно, как работает однострочник, представленный в начале заметки.

Также может быть вам интересно:

Пользователи и авторизация (логин) в Django, кастомизация пользователя

В Django есть множество встроенных возможностей, которые позволяют не реализовывать многие классы для стандартных операций. Среди них - авторизация. Django изначально предоставляет пользовательскую систему. Но её можно использовать лучше, чем по умолчанию.

Читать »

Пользователи и их создание в Django - своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит - надо уметь создавать пользователей, либо предоставлять возможность регистрации Django пользователей.

Читать »
Фото Как установить PostgreSQL на Linux и создать базу и пользователя

Как установить PostgreSQL на Linux и создать базу и пользователя

PostgreSQL - система управления базой данных общего назначения. Одна из самых распространённых баз данных, используемая на многих коммерческих и некоммерческих проектах.

Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.