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

Linux 从目录层次结构中的文件递归搜索和输出字符串,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,如何编写一个shell脚本来遍历给定目录下的所有子目录,并在每个子目录中搜索名为“版权”的文件中的字符串,如“许可证”或“GPL”,然后打印带有这些子字符串的行。运行此命令后,我应该能够知道找到的每个版权文件的结果。使用find with-exec: find . -name copyright -exec grep -H -e "license" -e "GPL" '{}' + >> results 命令 使用grep和Bash的**(globstar,用于深度扩展): 解释

如何编写一个shell脚本来遍历给定目录下的所有子目录,并在每个子目录中搜索名为“版权”的文件中的字符串,如“许可证”或“GPL”,然后打印带有这些子字符串的行。运行此命令后,我应该能够知道找到的每个版权文件的结果。

使用find with
-exec

find . -name copyright -exec grep -H -e "license" -e "GPL" '{}' + >> results
命令 使用
grep
和Bash的
**
(globstar,用于深度扩展):

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

  • -E
    -扩展regexp
将模式解释为扩展正则表达式(见下文)。 (-E由POSIX指定。)

工具书类
  • 与grep
  • (在Bash中>=4)

    • 我使用了一种尴尬的脚本为FreeBSD主机生成“许可报告”。我在anubhava的
      -exec
      中切换了
      xargs
      ,从而加快了速度。谢谢

      #!/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跨平台”:-)

      find
      命令和
      grep
      可以执行,但我没有完全理解最后一点。如果您想要的是总计或一种摘要报告,请尝试
      awk
      wc
      和朋友取出您需要的信息。正如我在下面指出的,这可能是
      perl
      及其
      format
      工具的工作;-)非常感谢您的回复。我将尝试这些,并让您知道。grep在Edouard中运行得很好,但我的系统没有globstar。
      globstar
      自Bash v4起可用,但默认情况下关闭。因此,shopt-s globstar在一开始就是
      。否则使用@anubhavaWorks great Anubhava给出的解决方案。如何使“license”和“GPL”不区分大小写?只需在grep中使用
      -I
      开关,如:
      find-名称版权所有-exec grep-H-i-e“许可证”-e“GPL”'{}'+>>结果
      #!/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