Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:统计文件夹中所有文件中出现的字符数_Bash - Fatal编程技术网

Bash:统计文件夹中所有文件中出现的字符数

Bash:统计文件夹中所有文件中出现的字符数,bash,Bash,我需要计算文件夹中所有文件中出现的字符数。我正在使用以下脚本: 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。为什么?计算文

我需要计算文件夹中所有文件中出现的字符数。我正在使用以下脚本:

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。为什么?

计算文件中给定字符数的一种方法是删除所有其他字符并计算剩余字符数
tr
是一个很好的选择:

tr -cd X < file
对于多个文件,使用
find
且不使用外部算法:

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

这里的诀窍是让
查找
-exec cat{}+
吐出所有文件的内容,然后用
tr
进行过滤,用
wc

计数文件中给定字符的数量的一种可能性是删除所有其他字符并计数其余字符
tr
是一个很好的选择:

tr -cd X < file
对于多个文件,使用
find
且不使用外部算法:

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

这里的诀窍是让
查找
-exec cat{}+
吐出所有文件的内容,然后用
tr
进行过滤,用
wc
进行计数编辑:误解了这个问题:)

试试这个,它应该可以工作:

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

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

编辑:误解了问题:)

试试这个,它应该可以工作:

find /etc/  -type f -print0| xargs  -0  grep -o  c | wc -l
PS.替换/etc/以获得您喜欢的任何文件夹

但是y的值总是0。为什么?

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

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

老实说,可能最简单的方法是省去变量
y
,以及临时文件,只需使用
grep
--recursive
标志让它为您搜索整个目录。然后,您所需要做的就是通过管道将其输出传输到
wc-l
,以统计它找到的事件。您的整个脚本可以写成:

grep -o --recursive -h c . | wc -l
但是y的值总是0。为什么?

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

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

老实说,可能最简单的方法是省去变量
y
,以及临时文件,只需使用
grep
--recursive
标志让它为您搜索整个目录。然后,您所需要做的就是通过管道将其输出传输到
wc-l
,以统计它找到的事件。您的整个脚本可以写成:

grep -o --recursive -h c . | wc -l

对于包含空格或换行符的文件名,您的方法已断开。这种错误太普遍了,已经不再有趣了。标准解决方法是使用
find
-print0
选项和
xargs
-0
选项。亲爱的,这很常见,也许你应该在发布答案之前记录下你自己。谢谢@gniourf_gniourf,学习新东西很好。如果我没有发布答案,我肯定会错过:)那么你不需要
xargs
真的,find会很乐意为你执行
grep
find/etc/-type f-exec grep-o c{}\wc-l
对于包含空格或换行符的文件名,您的方法被破坏。这种错误太普遍了,已经不再有趣了。标准解决方法是使用
find
-print0
选项和
xargs
-0
选项。亲爱的,这很常见,也许你应该在发布答案之前记录下你自己。谢谢@gniourf_gniourf,学习新东西很好。如果我没有发布答案,我肯定会错过:)那么你不需要
xargs
真的,find会很乐意为你执行
grep
find/etc/-type f-exec grep-o c{}\wc-l