我想运行find
命令,然后计算输出行,并给出结果的输出。我直截了当的做法是:
output=$(find ...)
lines=$(echo "$output" | wc -l)
echo "$output"
但遗憾的是,使用echo
将其加到wc
中会添加换行符,因此即使find
找不到任何内容(输出的零行),也会wc
正在发出1
(对于附加echo
的换行符。
我将echo
更改为printf
以防止将换行符添加到输出中,但是find
的单行输出(如var/
)也没有换行符,因此wc
发出了0
。
问题在于捕获输出($(...)
)。它会删除尾随的换行符,在我的例子中是相关的。
这可以以某种方式被阻止吗?
我的原始任务是否有完全不同的方法?
答案 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