Bash: как передать каждый результат одной команды в другую - PullRequest
1 голос
/ 04 августа 2010

Я хочу получить общее количество количества строк из всех файлов, возвращаемых следующей командой:

shell> find . -name *.info

Все файлы .info вложены в подкаталоги, поэтому я не могу просто сделать:

shell> wc -l *.info

Я уверен, что это должно быть в любом репертуаре пользователей bash, но я застрял!

Спасибо

Ответы [ 6 ]

2 голосов
/ 04 августа 2010
wc -l `find . -name *.info`

Если вы просто хотите получить сумму, используйте

wc -l `find . -name *.info` | tail -1

Редактировать: Трубопровод до xargs также работает и, надеюсь, может избежать «слишком длинной командной строки».

find . -name *.info | xargs wc -l
2 голосов
/ 04 августа 2010

Вы можете использовать xargs примерно так:

find . -name *.info -print0 | xargs -0 cat | wc -l
1 голос
/ 04 августа 2010

гуглинг появляется

find /topleveldirectory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'

, который, кажется, делает трюк

0 голосов
/ 04 августа 2010
# for a speed-up use: find ... -exec ... '{}' + | ...
find . -type f -name "*.info" -exec sed -n '$=' '{}' + | awk '{total += $0} END{print total}'
0 голосов
/ 04 августа 2010
find . -name "*.info" -exec wc -l {} \;

Примечание для себя - прочитайте вопрос

find . -name "*.info" -exec cat {} \; | wc -l
0 голосов
/ 04 августа 2010
#!/bin/bash
# bash 4.0
shopt -s globstar
sum=0
for file in **/*.info
do
   if [ -f "$file" ];then
       s=$(wc -l< "$file")
       sum=$((sum+s))
   fi
done
echo "Total: $sum"
...