捕获输出并计算其行数

时间:2014-04-25 13:54:09

标签: bash find wc

我想运行find命令,然后计算输出行,并给出结果的输出。我直截了当的做法是:

output=$(find ...)
lines=$(echo "$output" | wc -l)
echo "$output"

但遗憾的是,使用echo将其加到wc中会添加换行符,因此即使find找不到任何内容(输出的零行),也会wc正在发出1(对于附加echo的换行符。

我将echo更改为printf以防止将换行符添加到输出中,但是find的单行输出(如var/)也没有换行符,因此wc发出了0

问题在于捕获输出($(...))。它会删除尾随的换行符,在我的例子中是相关的。

这可以以某种方式被阻止吗?

我的原始任务是否有完全不同的方法?

3 个答案:

答案 0 :(得分:5)

要想到的一个简单的解决方法是检查字符串是否为空:

[ -z "$output" ] && count=0 || count=$(wc -l <<< "$output")

现在count 0如果find没有产生任何输出,那么它将包含输出中的行数。

答案 1 :(得分:3)

在变量中存储查找输出后计算新行总是会出现问题,以防文件名包含空格或新行。

我建议使用像这样的查找(计算所有*.txt个文件并打印出来)

output=
c=0

while read -d ''; do 
    ((c++))
    output+="$REPLY"$'\n'
done < <(find . -name "*.txt" -print0)

echo "c=$c"
echo "output=$output"

PS:这也会处理文件名中的新行/空格。

答案 2 :(得分:2)

我现在通过在输出中添加假行来使用解决方法;通过这种方式,我可以依赖于一条线始终存在的事实,这样空行很容易与单行区分开来:

r=$(find var/ -name var -printf "%p\n"; echo '==')
# appending additional line to be able to distinguish 0 from 1 found file
case "$(echo "$r" | wc -l)" in
  1)  # means 0 found files
    ...
  2)  # means 1 found file
    ...
  *)  # means more found files
    ...
esac