【问题标题】:Recursively search and output string from files in a directory hierarchy从目录层次结构中的文件递归搜索和输出字符串
【发布时间】:2015-05-13 05:49:14
【问题描述】:

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

【问题讨论】:

  • find 命令和grep 可以,但我没有完全理解最后一点。
  • 如果您想要的是总计或某种摘要报告,请尝试awkwc 和朋友提取您需要的信息。正如我在下面提到的,这可能是perl 及其format 工具的工作;-)

标签: linux bash shell scripting


【解决方案1】:

将 find 与 -exec 一起使用:

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

【讨论】:

  • 伟大的 Anubhava。如何使“许可”和“GPL”不区分大小写?
  • 只需在 grep 中使用 -i 开关,例如:find . -name copyright -exec grep -H -i -e "license" -e "GPL" '{}' + >> results
【解决方案2】:

命令

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

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

说明

  • globstar:

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

  • -E--extended-regexp

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

参考文献

【讨论】:

  • 非常感谢您的回复。我会尝试这些并让你知道。
  • grep 运行良好 Edouard 但我的系统没有 globstar。
  • globstar 自 Bash v4 起可用,但默认关闭。因此开头的shopt -s globstar。否则使用@anubhava 给出的解决方案
【解决方案3】:

这是我用来为 FreeBSD 主机生成“许可证报告”的一种令人尴尬的脚本。我通过将xargs 换成anubhava 的-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跨平台”。 :-)

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 2019-06-09
    • 2017-05-18
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多