2012-05-03 33 views
2

我有一個使用正則表達式查找文件的腳本。代碼如下:查找-regex比find |更慢grep

find $dir | grep "$regex" 

該腳本運行有點太慢,我想優化它。搜索需要一些時間來執行,我希望從中獲得更好的性能。我試過這個嘗試:

find $dir -regex ".*${regex}.*" 

由於沒有創建額外的進程來解析正則表達式,因此我期待稍快的結果。

然而結果卻是不同的,並令我驚訝的命令「找到| grep的」比「找到-regex」更快(儘管它需要更多的系統時間,作爲一個本來期望)

我有定時此行爲:

查找| grep的結果

real 0m12.467s 
user 0m2.568s 
sys 0m7.260s 

查找-regex結果

real 0m16.778s 
user 0m6.772s 
sys 0m6.380s 

你有什麼想法,爲什麼找-regex解決方案是慢?

回答

5

最有可能是因爲grep及其正則表達式引擎已經過多年高度優化,因爲這是它唯一的目的(「做一件事,做得很好」)。我不知道使用哪種正則表達式引擎find,但它顯然不像grep那樣高度精煉,可能是因爲它是一種不常用的次要功能。另外,如果你正在做這個文件列表的任何事情,你應該使用更安全的方式來做到這一點。我不認爲grep可以採用以零分隔的輸入(雖然它可以輸出它),所以即使速度較慢,也應該使用find [...] -regex [...] -print0

+0

謝謝你的提示。在這個用例中,我不需要-print0,但它是我經常使用的開關。我在Ruby中找到了查找的結果,並將字符串拆分爲「\ n」,因此除非名稱中有\ n,否則我應該沒問題。 – Huygens