Сначала Вы не должны использовать cat
для подсчета строк. Это антишаблон под названием Бесполезное Использование CAT (UUoC). Для подсчета строк в файлах в текущем каталоге используйте wc
:
wc -l *
Тогда эти find
команда рекурсивно вызывает подкаталоги:
find . -name "*.c" -exec wc -l {} \;
.
название главного каталога, чтобы начать искать от [1 126]
-name "*.c"
, шаблон файла, Вы интересуетесь [1 127]
-exec
, дает команду, которая будет выполняться
{}
, результат команды находки, которая будет передана команде (сюда wc-l
)
\;
, указывает на конец команды
, Эта команда производит список всех файлов, найденных с их количеством строки, если Вы хотите иметь сумму для [1 134] весь найденные файлы, можно использовать, находят для списка файлов (с -print
опция) и, чем использование xargs для передачи этого списка как аргумента туалету-l.
find . -name "*.c" -print | xargs wc -l
РЕДАКТИРОВАНИЕ для обращения к комментарию Robert Gamble (спасибо): если у Вас есть пробелы или новые строки (!) в именах файлов, то необходимо использовать -print0
опция вместо [1 115] и xargs -null
так, чтобы списком имен файлов обменялись с завершенными пустым указателем строками.
find . -name "*.c" -print0 | xargs -0 wc -l
философия Unix должна иметь инструменты, которые делают одну вещь только и делают это хорошо.
Если Вы хотите играющий в гольф код ответ:
grep '' -R . | wc -l
проблема только с использованием туалета-l самостоятельно является им убывание наклона хорошо, и остроты с помощью [1 112]
find . -exec wc -l {} \;
не дадут Вам общее количество строки, потому что это выполняет туалет однажды для каждого файла, (loL!) и
find . -exec wc -l {} +
запутается, как только находят хиты <глоток> ~200k 1 глоток> <глоток>, глоток> <глоток> 2 глоток> символьный предел аргумента для параметров, и вместо этого называет туалет [приблизительно 118] времена, каждый раз, только дающий Вам частичная сводка.
Кроме того, вышеупомянутое grep прием не добавит больше чем 1 строку к выводу, когда это встретится с двоичным файлом, который мог быть обстоятельно выгодным.
Для стоимости 1 дополнительного управляющего символа, можно проигнорировать двоичные файлы полностью:
grep '' -IR . | wc -l
, Если Вы хотите выполнить строку, рассчитывает на двоичные файлы также
grep '' -aR . | wc -l
Сноска на пределах: документы немного неопределенны относительно того, является ли это строка предел размера или количество маркеров предел.
cd /usr/include;
find -type f -exec perl -e 'printf qq[%s => %s\n], scalar @ARGV, length join q[ ], @ARGV' {} +
# 4066 => 130974
# 3399 => 130955
# 3155 => 130978
# 2762 => 130991
# 3923 => 130959
# 3642 => 130989
# 4145 => 130993
# 4382 => 130989
# 4406 => 130973
# 4190 => 131000
# 4603 => 130988
# 3060 => 95435
Это подразумевает его попытку разделить на блоки очень очень легко.
Я думаю, что Вы, вероятно, застреваете с методом xargs
find -name '*php' | xargs cat | wc -l
chromakode , дает тот же результат, но намного намного медленнее. При использовании xargs Ваш кошка луг и туалет , луг может запуститься, как только находят , начинает находить.
Хорошее объяснение в Linux: xargs по сравнению с должностным лицом {}
Попытайтесь использовать эти find
команда, которая рекурсивно вызывает каталоги по умолчанию:
find . -type f -execdir cat {} \; | wc -l
Корректный путь:
find . -name "*.c" -print0 | xargs -0 cat | wc -l
необходимо использовать-print0, потому что существует только два недопустимых символа в именах файлов Unix: пустой байт и "/" (наклонная черта). Таким образом, например, "xxx\npasswd" является допустимым именем. В действительности Вы, более вероятно, встретитесь с именами с пробелами в них, все же. Команды выше считали бы каждое слово как отдельный файл.
Вы могли бы также хотеть использовать "-тип f" вместо - имя для ограничения поиска файлами.
Использование cat или grep в решениях выше расточительно, если вы можете использовать относительно свежие инструменты GNU, включая Bash:
wc -l --files0-from=<(find . -name \*.c -print0)
Это обрабатывает имена файлов с пробелами, произвольную рекурсию и любое количество совпадающих файлов, даже если они превышают ограничение на длину командной строки.