Bash 浏览多个文件的多个路径

Bash 浏览多个文件的多个路径,bash,mapping,Bash,Mapping,我目前正在编写一个小bash脚本,它读取源C文件,然后查找相应的include文件 现在,我必须在两种查找映射M:filename->{include file path}的模型之间进行选择。我有两个数组,一个包含找到的include文件名,另一个包含可能的路径。这些选择包括: a) 在一个路径中查找每个文件,然后转到另一个路径 b) 通过路径列表查找一个文件,然后继续查找另一个文件 我的问题是——什么会更快?每个选项中的迭代次数相同,但某些命令可能更耗时?我个人更喜欢选择a) 谢谢你的帮助,如

我目前正在编写一个小bash脚本,它读取源C文件,然后查找相应的include文件

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

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

b) 通过路径列表查找一个文件,然后继续查找另一个文件

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


谢谢你的帮助,如果这是个愚蠢的问题,我很抱歉

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

我将遍历所有的include文件,并以某种顺序查看路径-
include应该首先搜索系统include路径以获得更快的结果,而
本地
include也是如此。在解析时丢弃此信息是不明智的


但是,我认为只要在所有include路径上运行
find-typef
,并将结果存储在临时文件或变量中,就可以做得更好。然后您只需
grep
(或任何等效项)为includes本身创建它。这样可以节省一些I/O,因为其中一半是一次性读取的,而且只能读取一次。

要查找包含文件,一个专门的解决方案是,特别是如果您仍然使用makefiles。

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

如果您想查找系统上有多个版本的头文件,请考虑使用<代码>定位> /代码>命令。例如,在我的Ubuntu12.04Linux系统上,下面的命令需要大约一秒钟的时间才能完成,并生成下面所示的输出

  $ 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
一起使用,如果您愿意的话。)在
xyz
中有两行(
stdio.h
stdlib.h
)在
pqr
中有两行(
/usr/lib//code>),我的系统上的命令需要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
,这将使总时间增加几秒钟到几分钟。

谢谢您的评论,Lynxlynx,这帮了大忙。我将尝试按照您建议的方式实现它=)非常感谢您,jwpat7,这是非常有用的信息。我的目标确实是找到多个版本的头文件,然后打印到stdout的路径,而不是创建makefile。然而,问题是我不知道这个文件名数据库是否存在于每个linux系统上。。。为了测试我的程序,我使用MacOSX,而不是linux。我试图使用locate,但被要求输入管理员密码。我想知道在我没有管理员权限的其他系统上使用此脚本时是否也会发生同样的情况。自slackware 0.98以来,locate一直是我使用的所有linux发行版的一部分,除了live CD版本,并且可供普通用户使用。然而,updatedb命令通常需要管理员权限。还有,有很多关于在OS X上定位的链接。好的,我已经有了,谢谢。其目的是使程序通用于linux,因此为了避免错误,我将以某种方式(是的,我是bash新手-仅3周=)使用if子句检查它是否工作。但如果您说locate必须是当前所有linux发行版的一部分,那么这些错误就不太可能发生。