2012-10-13 63 views
2

我目前正在研究一个读取源C文件的小bash脚本,然后找到相应的包含文件。浏览许多文件的路径

现在我必须在两种找到映射M:filename - > {include file paths}的模型中进行选择。我有两个数组 - 一个找到包含文件名,另一个包含可能的路径。选项有:

a)在一个路径中查找每个文件,然后继续到另一个路径;

b)查看路径列表以查找一个文件,然后转到另一个文件。

我的问题是 - 什么会更快?每个选择中都有相同数量的迭代,但也许有些命令更耗时?我个人更喜欢选项a)。

感谢您的任何帮助和抱歉,如果这是一个愚蠢的问题。

回答

1

只有在编码不好的情况下才会有相同的迭代次数,一旦找到匹配,不会使用continue关键字(不要忘记它也可以将数字作为参数来影响外部循环)。

我会遍历所有的包含文件,并查看一些排序的路径 - <system>包括搜索系统应该首先包含路径以获得更快的结果,而"local"也包含相同的结果。在解析时丢弃这些信息是不明智的。

但是,我认为只要在所有包含路径上运行find -type f并将结果存储在临时文件或变量中,您可以做得更好。那么你只需要grep(或任何相当的)它包括自己。这样你可以节省一些I/O,因为它的一半是一次读取而且只读取一次。

+0

感谢您的评论,lynxlynxlynx,它帮助了很多。我会尽力按照你的建议=) – petajamaja

0

要找到您的包含文件,专门的解决方案将是makedepend,特别是如果您正在使用makefiles。

1

你应该做什么取决于你的目标,我不太明白。如果您正在创建make文件,则可能应该使用makedepend,如前面的答案中所述。

如果您想要知道系统中是否有多个版本的头文件,请考虑使用locate命令。例如,在我的Ubuntu 12.04 linux系统中,以下命令需要大约一秒才能完成,并生成命令下面显示的输出。

$ locate stdio.h | grep usr/include 
    /usr/include/stdio.h 
    /usr/include/c++/4.6/tr1/stdio.h 
    /usr/include/glib-2.0/glib/gstdio.h 
    /usr/include/sharutils/stdio.h 
    /usr/include/x86_64-linux-gnu/bits/stdio.h 

如果您有关于文件PQR的单独的行库的路径列表,和头文件在文件XYZ的列表,你可以使用如下命令

locate/| grep -f xyz | grep -f pqr 

(注意,-F可能与-f沿如果你喜欢随着xyzpqr两行(stdio.hstdlib.h)和两行(/usr/include//usr/lib/和)一起使用。),该命令需要0.7秒我的系统中,以产生输出

/usr/include/stdio.h 
    /usr/include/stdlib.h 
    /usr/include/c++/4.6/tr1/stdio.h 
    /usr/include/c++/4.6/tr1/stdlib.h 
    /usr/include/freetype2/freetype/config/ftstdlib.h 
    /usr/include/glib-2.0/glib/gstdio.h 
    /usr/include/sharutils/stdio.h 
    /usr/include/sharutils/stdlib.h 
    /usr/include/x86_64-linux-gnu/bits/stdio.h 
    /usr/include/x86_64-linux-gnu/bits/stdlib.h 
    /usr/lib/perl/5.14.2/CORE/nostdio.h 
    /usr/lib/syslinux/com32/include/stdio.h 
    /usr/lib/syslinux/com32/include/stdlib.h 

请注意,在典型的linux系统上,文件名数据库每天更新一次。这在查找系统头文件时可能不会有问题。对于更短暂的文件,在使用locate之前,您可能需要说sudo updatedb,并且这会在整个时间内增加几秒到几分钟的时间。

+0

执行它非常感谢你,jwpat7,这是非常有用的信息。我的目标确实是找到多个版本的头文件,然后将路径打印到stdout,而不是创建makefile。然而,问题是我不知道这个文件名数据库是否存在于每个linux系统上......为了测试我的程序,我使用了mac OS X,而不是linux。我试图使用定位,但被要求输入管理员密码。当我在没有管理员权限的其他系统上使用此脚本时,是否会发生同样的情况。 – petajamaja

+0

locate自从slackware 0.98以来一直是我使用的所有Linux发行版的一部分,除了live-CD版本,并且普通用户可以使用。然而,updatedb命令通常需要管理员权限。另外,[google for mac os x找到数据库更新](https://www.google.com/#hl=zh-CN&sclient=psy-ab&q=mac+os+x+locate+database+update&oq=mac+OS+X+定位&gs_l = hp.1.1.0l4.943.4898.0.7121.2.2.0.0.0.0.165.311.0j2.2.0.les%3B..0.0 ... 1c.1.aX3F5_RK1Hk&PBX = 1&BAV = on.2,or.r_gc.r_pw .r_qf。&fp = 96a2ca9e4750509&bpcl = 35277026&biw = 923&bih = 579)有很多关于在OS X上定位的链接。 –

+0

好的,我已经做了,谢谢。其目的是使程序通用于Linux,所以也许为了避免错误我会以某种方式(是的,我是bash的新手 - 只有3周=))使用if-clause来检查它是否工作。但是如果你说定位必须是当前所有Linux发行版的一部分,那么这些错误不太可能发生。 – petajamaja

相关问题