Пояснение:
find. -type f -name '*.c'
-рекурсивно найти все файлы в текущем каталоге с любыми символами в имени и .c
расширением. См.man find
-exec cat {} \;
-получить содержимое файлов, найденных на предыдущем шаге. См. -конструкция exec:-exec command {} +
sed '/^\s*#/d;/^\s*$/d;/^\s*///d'
-удалить несколько типов «комментариев» (или что-то подобное ). Эта часть состоит из 3 разделов, разделенных ;
. Где:
/^\s*#/d
-начало строки (^
), 0, 1 или более пробелов(\s*
)и символ #
.//d
-удалить совпавшую строку; /^\s*$/d
-пустые строки. То же, что и в предыдущей части, но с символом $
, означающим конец строки /^\s*\/\//d
-соответствует строкам с двумя косыми чертами (\/\/
,\
-обратная косая черта, чтобы заключить косую черту в кавычки )и 0,1 или более пробелов перед ними wc -l
-подсчет количества строк кода
find. -type f -name '*.c'
найти любой файл, оканчивающийся на.c
-exec cat {} \;
запустить cat
команду для печати файла (что на самом деле бессмысленно :имя файла может быть передано в качестве аргумента непосредственно в sed
вместо конвейера)
| sed '/^\s*#/d;/^\s*$/d;/^\s*\/\//d'
удалите все директивы препроцессора, пустые строки и комментарии из файла (вы можете просмотреть свой файл без комментариев, удалив часть | wc -l
из команды)
| wc -l
Подсчитайте общее количество отображаемых строк после фильтрации комментариев.
Объясните смысл? Хорошо. Я думаю, это означает, что кто-то любит передавать стандартный вывод от команды к команде.
Я думаю, что все это можно было бы заменить простым
find. -type f -name '*.c' -exec grep -cv -e '^\s*#' -e '^\s*$' -e '^\s*//' {} \;