标签:
1 #!/bin/sh 2 #find the count of same name files under current directory 3 4 rm -rf search.txt 5 for file in `find . -name "*.txt"` 6 do 7 echo `basename ${file}` >> search.txt 8 done 9 10 cat search.txt | sort | uniq -c > times_of_file.txt 11 12 13 rm -rf result.txt 14 while read line 15 do 16 file_cnt=`echo ${line} | awk -F‘ ‘ ‘{print $1}‘` 17 file_name=`echo ${line} | awk -F‘ ‘ ‘{print $2}‘` 18 #echo ${line} >> result.txt 19 echo "file name:${file_name}, count is:${file_cnt}" >> result.txt 20 echo "file paths are:" >> result.txt 21 find . -name "${file_name}" >> result.txt 22 done < times_of_file.txt 23 24 rm -rf times_of_file.txt 25 rm -rf search.txt
写这个脚本的背景是:商用环境上存在相同名称的.so 文件,系统默认查找的是旧的.so 文件,导致组件安装失败。
所以想写个脚本,确认环境上同名文件的个数,同名文件存在的具体路径。
上述脚本的执行结果:
1 $ cat result.txt 2 file name:1.txt, count is:4 3 file paths are: 4 ./2/1.txt 5 ./1/1.txt 6 ./3/1.txt 7 ./4/4_1/1.txt 8 file name:2.txt, count is:2 9 file paths are: 10 ./2/2.txt 11 ./1/2.txt 12 file name:3.txt, count is:1 13 file paths are: 14 ./3/3.txt 15 file name:4.txt, count is:1 16 file paths are: 17 ./4/4.txt
脚本的输出默认重定向到文件中,这样即使数据量很大时,也能防止查询结果刷屏,导致后期的确认存在困难。
对查询结果sort 之后,使用 uniq -c 方便的统计同名字符串出现次数,这是我记录这个脚本的初衷,因为这个命令在这个场景下真的很好用。
网上很多人都说使用grep -c 统计相同字符串,觉得很不方便。
至于为什么要先sort,然后再使用uniq -c, 是因为uniq -c 只能对连在一起的相同字符串做统计。
$ cat test.txt A B A $ cat test.txt | uniq -c 1 A 1 B 1 A
如上,uniq -c 不能正确的统计A 出现的次数,所以sort之后,两个A会连在一起,那么就能正确的统计次数。
上述脚本中使用了shell 中的for 循环和while循环两种格式,读取文件时,个人常用的即是while循环格式。
while循环读取的文件最后一行最好有一个空行,否则windows下的文件放到linux下时无法有效读取到最后一行。
标签:
原文地址:http://www.cnblogs.com/xbh-blog/p/4965242.html