浏览许多文件的许多路径

时间:2012-10-13 21:49:18

标签: bash mapping

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

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

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

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

我的问题是 - 什么会更快?每个选项中的迭代次数相同,但是某些命令可能更耗时?我个人更喜欢选项a)。

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

3 个答案:

答案 0 :(得分:1)

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

我将迭代所有包含文件并查看带有一些排序的路径 - <system>包括搜索系统首先包含路径以获得更快的结果,而"local"包含的情况也是如此。解析时丢弃此信息是不明智的。

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

答案 1 :(得分: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一起使用,如果您愿意的话。)在stdio.h中有两行(stdlib.hxyz),在/usr/include/中有两行(/usr/lib/pqr),该命令在我的系统上占用.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系统上,文件名数据库每天更新一次。在查找系统头文件时,这可能不会成为问题。对于更具瞬态性的文件,您可能需要在使用sudo updatedb之前说出locate,这会在几分钟到整个时间内添加几秒钟。

答案 2 :(得分:0)

要查找包含文件,专用解决方案将为makedepend,特别是如果您仍在使用makefile。