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