2012-10-13 64 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

相關問題