如何编写一个 shell 脚本来遍历给定目录下的所有子目录,并在每个子目录中搜索名为“copyright”的文件中的“license”或“GPL”等字符串并打印这些行子字符串。运行此程序后,我应该能够说出找到的每个版权文件的结果。
问问题
389 次
3 回答
1
使用 find -exec
:
find . -name copyright -exec grep -H -e "license" -e "GPL" '{}' + >> results
于 2013-06-25T14:56:56.850 回答
1
命令
使用grep
和 Bash 的**
(globstar,用于深度扩展):
shopt -s globstar; # enable ** support
grep -i -E 'licence|GPL' **/copyright
解释
globstar
:
如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则只有目录和子目录匹配。
-E
,--extended-regexp
:
将 PATTERN 解释为扩展的正则表达式(ERE,见下文)。(-E 由 POSIX 指定。)
参考
- foo OR bar与 grep在同一行;
globstar
选项(在 Bash >=4 中)
于 2013-06-25T14:58:28.453 回答
0
这是我用来为 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 跨平台”。:-)
于 2013-06-25T16:12:48.353 回答