Bash:计算文件夹的所有文件中char的出现次数

时间:2014-05-17 13:11:16

标签: bash

我需要在文件夹的所有文件中计算char的出现次数。我正在使用这个脚本:

TEMPFILE=/tmp/1.tmp
echo 0 > $TEMPFILE
y=0
cat $TEMPFILE
for file in `find -name "*.*"`
do
   grep -o c $file | y=$(cat $TEMPFILE)+$(wc -l);
   echo $y > $TEMPFILE 

done

echo $(cat $TEMPFILE) 

但是y的值始终为0.为什么?

3 个答案:

答案 0 :(得分:2)

计算文件中给定字符数的一种可能性是删除所有其他字符并计算剩余字符数。 tr是一个不错的选择:

tr -cd X < file

只会从文件X输出字符file。然后计算文件Xfile的数量:

tr -cd X < file | wc -m

对于多个文件,使用find并且没有外部算术:

find . -type f -exec cat {} + | tr -cd X | wc -m

这里的诀窍是让find使用-exec cat {} +吐出所有文件的内容,然后使用tr进行过滤并使用wc进行计数。

答案 1 :(得分:1)

  

但是y的值始终为0.为什么?

每当使用管道|连接多个命令时,每个命令都在子shell 中运行,这意味着它获得了执行环境的单独副本(变量,shell函数,工作目录) , 等等)。因此,当您在管道中的一个命令中为y分配内容时,您实际上正在为y副本分配内容 - 一个名为{{1的单独变量周围的脚本永远看不到。

您的脚本也存在其他问题,但这是主要问题。

老实说,放弃变量y以及临时文件可能是最简单的,只需使用y的{​​{1}}标志来搜索整个变量grep你的目录。然后,您需要做的就是将其输出传递给--recursive以计算它找到的事件。您的整个脚本可以写成:

wc -l

答案 2 :(得分:0)

编辑:误解了这个问题:)

试试这个,它应该有效:

find /etc/  -type f -print0| xargs  -0  grep -o  c | wc -l

PS。将/ etc /替换为您喜欢的任何文件夹