使用pipe道在bash中划分的最佳方式是什么?

我只是寻找一个简单的方法来划分一个数字(或提供其他的math函数)。 假设我有以下命令:

find . -name '*.mp4' | wc -l 

我怎样才能把wc -l的结果除以3呢?

我见过的例子并不涉及重新导出/导入

谢谢

使用bc

 $ bc -l <<< "scale=2;$(find . -name '*.mp4' | wc -l)/3" 2.33 

相比之下,bash shell只执行整数运算。

Awk也非常强大:

 $ find . -name '*.mp4' | wc -l | awk '{print $1/3}' 2.33333 

如果使用awk你甚至不需要wc

 $ find . -name '*.mp4' | awk 'END {print NR/3}' 2.33333 

有不止一种方法:

使用bc (二进制计算器)

 find . -name '*.mp4' | wc -l | xargs printf "%d/3\n" | bc -l 

要么

 echo $(find . -name '*.mp4' | wc -l)/3|bc -l 

或者使用bash,只会导致整数:

 echo $(($(find . -name '*.mp4' | wc -l)/3)) 

纯粹的打击

用最近的64位bash,你甚至可以使用@ glennjackman关于使用globstar 的想法 ,但是计算伪浮动可以通过以下方式完成:

 shopt -s globstar files=(**/*.mp4) shopt -u globstar res=$[${#files[*]}000/3] printf -v res "%.2f" ${res:0:${#res}-3}.${res:${#res}-3} echo $res 

没有fork, $res包含一个两位数的舍入浮点值。

注意 :使用globstar**时要注意 符号链接

根据你的bash版本,你甚至不需要找到这个简单的任务:

 shopt -s nullglob globstar files=( **/*.mp4 ) dc -e "3 k ${#files[@]} 3 / p" 

此方法将正确处理包含换行符的文件名的奇怪边框。

find . -name '*.mp4' | wc -l | xargs -I{} expr {} / 2

最好使用,如果你有多个输出你想通过xargs管道。 使用{}作为表达式的占位符。