从目录层次结构中的文件递归搜索和输出字符串

时间:2013-06-25 14:53:10

标签: linux bash shell scripting

如何编写shell脚本来遍历给定目录下的所有子目录,并在每个子目录中搜索名为“copyright”的文件,查找“license”或“GPL”等字符串并打印这些子字符串的行。运行之后,我应该能够告诉我们找到的每个版权文件的结果。

3 个答案:

答案 0 :(得分:1)

将find与-exec一起使用:

find . -name copyright -exec grep -H -e "license" -e "GPL" '{}' + >> results

答案 1 :(得分:1)

命令

使用grep和Bash' **(globstar,用于深度扩展):

shopt -s globstar; # enable ** support
grep -i -E 'licence|GPL' **/copyright

说明

  • globstar
  

如果设置,路径名扩展上下文中使用的模式**将   匹配所有文件和零个或多个目录和子目录。如果   该模式后跟一个/,只有目录和子目录   匹配。

  • -E--extended-regexp
  

将PATTERN解释为扩展正则表达式(ERE,见下文)。   (-E由POSIX指定。)

参考

答案 2 :(得分:0)

这是我用于为FreeBSD主机制作“许可证报告”的一种令人尴尬的脚本。我通过为anubhava xargs切换-exec来加快速度。谢谢!

#!/bin/sh
#
# pkg_license_check
#
# TODO: make this report on unlicensed packages.
#
LICENSES='MIT GPL ART BSD'

for LICENSE in $LICENSES
do

 cd /usr/local/share/licenses
 num=`find . -name LICENSE -exec grep -e "$LICENSE" '{}' + | wc -l`
 echo "Total of $num $LICENSE  Licensed packages as follows:"
 find . -name LICENSE -exec grep -e "$LICENSE" -e '{}' + | awk -F":" '{sub("^\.\/", "", $1); print "\n" $1 "\n" $2 $3}'
 echo -e "\n\n------------------------------------------------------------------------- \n\n"

done

为期一天的RSN项目:在perl中重写并使用插件为不同的打包系统制作“POSIX跨平台”。 :-)