2017-01-21 5 views
2

Мне также нужно, чтобы имя каталога также выводилось. То, что я смог сделать, - вывести общее количество строк во всех каталогах с именем каталога.Как подсчитать все строки файлов

find . -name '*.c' | xargs wc -l | xargs -I{} dirname {} | xargs -I{} dirname {} 
+0

Вы можете повторно итерацию ваши требования с соответствующим примером? Не могли бы вы объяснить это подробнее? – Inian

+0

@ Инициал, в основном я хочу иметь путь к каталогу и количество строк, заканчивающихся точкой с запятой в этом каталоге (количество строк из всех файлов в этом каталоге). Я могу вывести общее количество строк, заканчивающихся точкой с запятой в каталоге с помощью «find». -name '* .c' -print0 | xargs -0 grep '[;] $' | wc -l ', но я не знаю, как получить вывод по каталогу. – Theseven7

+0

@ Иниан, сделал это. – Theseven7

ответ

0

Я перемешалось смесь из bash команд в основном GNU Определённые, убедитесь, что у вас есть, GNU grep и GNU Awk

find . -type f -print0 | xargs -0 grep -c ';$' | \ 
    awk -F":" '$NF>0{cmd="dirname "$1; while ((cmd | getline result) > 0) {printf "%s\t%s\n",result,$2} close(cmd) }' 

Идея заключается в том grep -c возвращает количество шаблона в формате, file-name:count, который я передав его GNU Awk для фильтрации тех файлов, чей счет больше нуля, и распечатайте каталог файла, содержащего его, и самого счетчика.

Как фантазии однострочника, как они называют его в эти дни,

find . -type f -print0 | xargs -0 grep -c ';$' | awk -F":" '$NF>0{cmd="dirname "$1; while ((cmd | getline result) > 0) {printf "%s\t%s\n",result,$2} close(cmd) }' 
+0

Работает! Спасибо за объяснение. – Theseven7

0

Вот скрипт:

#!/usr/bin/env bash 

for dir in */; do (
    cd "$dir" 
    count=$(find . -name '*.c' -print0 | xargs -0 grep '[;]$' | wc -l) 
    echo -e "${count}\t${dir}" 
) done 

Если вы хотите номера для каждой поддиректории:

#!/usr/bin/env bash 

for dir in $(find . -type d); do (
    cd "$dir" 
    count=$(find . -maxdepth 1 -name '*.c' -print0 | \ 
     xargs -0 grep '[;]$' | wc -l) 
    echo -e "${count}\t${dir}" 
) done 

Использование -maxdepth 1 убеждается расчет делается только в текущем каталоге, а не его подкаталоги. Поэтому каждый файл подсчитывается один раз.

+0

есть ли способ изменить цикл, чтобы посмотреть в подкаталоги? – Theseven7

+0

Добавлен еще один скрипт. –

Смежные вопросы