yocto系列讲解 (技能篇) 57 - 如何快速搜索和查找

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

返回总目录 Yocto开发讲解系列 - 总目录

前言

**考虑到现在有怎么个情形:**我知道某个项目和我现有的项目很接近,我想参考下它是怎么在yocto中实现的,包括bb文件和源码等,我需要快速搜索文件和查找关键词。
当然我们可以使用 find grep 等命令来搜索和查找,但是我们的poky目录下有很多的bb、append、class和inc等文件,build目录下又有很多的源码和输出文件,如果每次都用find和grep来实现的话,那么无疑是一场 噩梦 。yocto项目实在是太大了,要查找和搜索某个文件或者关键词无疑要 花费太多太多的时间 ,长时间等待是一件极其痛苦的事情。

今天我就结合自身的经验,给大家整理一个 快速 搜索 文件 和查找 关键词 的方法

生成我们的文件数据库

首先,使用 updatedb 命令生成文件数据库,默认使用 updatedb 的时候会更新根目录下(会过滤etc/updatedb.conf配置)的内容,通过下面的方法对一个 android yocto 代码库生成一个 myupdatedb 数据块,下面的过程可能花费较长的时间,建议在空闲时间执行。

poky]$ sudo updatedb -U .  -o myupdatedb
[sudo] password for peeta:
poky]$ ls -l myupdatedb #最后在poky目录下生成这个文件
-rw-r----- 1 root mlocate 770068153 522 16:13 myupdatedb
  • 1
  • 2
  • 3
  • 4

搜索文件演示

首先,我们假设想搜索linux-yocto_5.8.bb文件,可以通过如下方法搜索:

poky]$ locate -d myupdatedb linux-yocto_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb
/home/peeta/poky/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.8.bbappend
  • 1
  • 2
  • 3

进一步优化,如果每次都需要输入那么长的命令行确实有点难受,我们可以起个别名,比如:

poky]$ vim ~/.bashrc
... 
alias mylocate='locate -d /home/peeta/poky/myupdatedb' #添加这一行
...
poky]$ source ~/.bashrc
  • 1
  • 2
  • 3
  • 4
  • 5

以后查找文件时就可以这样了:

poky]$ mylocate linux-yocto_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb
/home/peeta/poky/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_5.8.bbappend
  • 1
  • 2
  • 3

而且可以再任意位置调用mylocate命令(最好我们将myupdatedb文件进行一个备份哦,免得误删除)
话说,如果要搜索多种类型的文件呢?参考:

poky]$ mylocate *.bb *.bbappend *.inc *.conf *.bbclass
...
/home/peeta/poky/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
/home/peeta/poky/meta-skeleton/recipes-multilib/images/core-image-multilib-example.bb
/home/peeta/poky/meta-skeleton/recipes-skeleton/service/service_0.1.bb
/home/peeta/poky/meta-skeleton/recipes-skeleton/useradd/useradd-example.bb
/home/peeta/poky/meta-yocto-bsp/conf/layer.conf
/home/peeta/poky/meta-yocto-bsp/conf/machine/beaglebone-yocto.conf
/home/peeta/poky/meta-yocto-bsp/conf/machine/edgerouter.conf
/home/peeta/poky/meta-yocto-bsp/conf/machine/genericx86-64.conf
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

现在假设如果我们要查询的文件在build目录中也存在,会有很多很多,比如:

poky]$ mylocate linux-yocto
/home/peeta/poky/documentation/profile-manual/figures/pybootchartgui-linux-yocto.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm-nostrip.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm.png
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb
...
/home/peeta/poky/build/tmp/deploy/licenses/linux-yocto
/home/peeta/poky/build/tmp/deploy/licenses/linux-yocto/COPYING
...
/home/peeta/poky/build/tmp/sysroots-components/qemux86_64/linux-yocto
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

实在是太多了,那如果我们只希望关注 poky/build 目录之外的文件或目录该如何处理呢,可以使用 grep -v 反向匹配过滤 poky/build ,看结果:

poky]$ mylocate linux-yocto | grep -v "poky/build"
/home/peeta/poky/documentation/profile-manual/figures/pybootchartgui-linux-yocto.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm-nostrip.png
/home/peeta/poky/documentation/profile-manual/figures/pychart-linux-yocto-rpm.png
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-tiny_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-tiny_5.8.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto.inc
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.4.bb
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

查找文件中的关键词

现在,又有一种应用情形:我想了解 bb bbappend 文件中 KERNEL_EXTRA_FEATURES 变量的使用样例。
OK,先看一种使用情况:

poky]$ mylocate *.bb *.bbappend *.inc *.conf *.bbclass | grep -v "poky/build" | xargs grep -in KERNEL_EXTRA_FEATURES
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb:47:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-dev.bb:48:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb:39:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.4.bb:40:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb:39:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto-rt_5.8.bb:40:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.4.bb:48:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.4.bb:49:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb:49:KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
/home/peeta/poky/meta/recipes-kernel/linux/linux-yocto_5.8.bb:50:KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面列举了文件路径,关键词出现的行号等信息。

输出某些文件内容到一个文件中

在上面的演示中我们看到了通过查找某个关键词时可以使用mylocate和grep命令组合的形式来查找。但是我的开发经验过程中,仍旧发现该方法比较笨,而且也有点费时,那么我们该如何进一步提升效率呢?
我们可以将某一类比如bb文件相关的内容直接重定向到一个文件中,以后想看某个关键词时,轻松搜索即可。
下面我演示将poky目录除了build目录之外的所有 bb bbappend bbclass inc conf 文件路径和内容都重定向到一个单一的文件中的做法,参考:

poky]$ for c in `mylocate *.bb *.bbappend *.inc *.conf *.bbclass | grep -v "poky/build"`;do echo $c >> allbbandinc;cat $c >> allbbandinc;done
  • 1

然后我们打开这个allbbandinc文件看下:

poky]$ vim allbbandinc
1 /home/peeta/poky/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass
2 SLOWTASKS ??= ""
3 SSTATEVALID ??= ""
4 
5 def stamptask(d):
6     import time
7 
8     thistask = d.expand("${PN}:${BB_CURRENTTASK}")
9     stampname = d.expand("${TOPDIR}/%s.run" % thistask)
10     with open(stampname, "a+") as f:
11         f.write(d.getVar("BB_UNIHASH") + "\n")
...
				Line: 1/117466:1  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

虽然该文件有117466多行,但是打开的速度也是秒开,而且搜索匹配的效率杠杠的,而且还带有对应文件的目录位置信息。当然这个 allbbandinc 文件也可放到 window 或者其他目录里面,以免丢失。然后再文本软件中查找或者使用linux的 vim 中的 / 斜杠命令也可以查找。比如查找上面的KERNEL_EXTRA_FEATURES变量:
在这里插入图片描述
是不是就很方便呢!

To be continue~

希望帮我点个赞加关注,你的喜欢就是我持续更新的动力!