我需要在文件夹的所有文件中计算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.为什么?
答案 0 :(得分:2)
计算文件中给定字符数的一种可能性是删除所有其他字符并计算剩余字符数。 tr
是一个不错的选择:
tr -cd X < file
只会从文件X
输出字符file
。然后计算文件X
中file
的数量:
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 /替换为您喜欢的任何文件夹