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