Bash:如何将一个命令的每个结果传递给另一个命令

时间:2010-08-04 11:12:10

标签: bash pipe

我希望获得以下命令返回的所有文件中行数的计数:

shell> find . -name *.info

所有.info文件都嵌套在子目录中,所以我不能简单地执行:

shell> wc -l *.info

我确定这应该是任何bash用户的保留曲目,但我被卡住了!

由于

6 个答案:

答案 0 :(得分:2)

你可以这样使用xargs

find . -name *.info -print0 | xargs -0 cat | wc -l

答案 1 :(得分:2)

wc -l `find . -name *.info`

如果您只想要总数,请使用

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

编辑:管道到xargs也有效,希望可以避免'命令行太长'。

find . -name *.info | xargs wc -l

答案 2 :(得分:1)

一些谷歌搜索出现

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

似乎可以解决这个问题

答案 3 :(得分:0)

#!/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"

答案 4 :(得分:0)

find . -name "*.info" -exec wc -l {} \;

注意自我阅读问题

find . -name "*.info" -exec cat {} \; | wc -l

答案 5 :(得分:0)

# for a speed-up use: find ... -exec ... '{}' + | ...
find . -type f -name "*.info" -exec sed -n '$=' '{}' + | awk '{total += $0} END{print total}'