- 論壇徽章:
- 1
|
論壇里有網(wǎng)友問在一個(gè)有非常多很大文件的目錄中搜索的問題,顯然這時(shí)我們最關(guān)心的是性能的。你可能會(huì)說最好用C來做,不過在好的算法下shell的性能也許能夠滿足要求。這里我們假定我們要查找的東西只會(huì)出現(xiàn)一次。那么:
1.我們的程序應(yīng)該在找到匹配后放棄搜索其它文件;
2.由于文件的行數(shù)也很大,所以程序在找到匹配后退出當(dāng)前文件的搜索。
如果直接用shell來做,可能會(huì)碰到命令行長度或參數(shù)數(shù)目的限制問題,如果用xargs重新裝配命令行,也有些很難處理的麻煩。所以索性用perl寫了一個(gè),請(qǐng)大家指正:
- #!/usr/bin/perl
- die "usage: $0 path pattern\n" unless @ARGV == 2;
- ($path, $pattern)=@ARGV;
- $, = " ";
- print $path;
- opendir(DH, $path) or die "cannot open dir!";
- while($file = readdir(DH)) {
- next if (!open(FH, "./".$file));
- while(<FH>) {
- print $file, $1 if (m/($pattern)/);
- if ($1) {
- printf STDERR "found in %s line %d!\nexiting...\n", $file, $.;
- exit 0; # change this to "next;" (no ") if you want to find in other files
- }
- }
- close(FH);
- }
- closedir(DH);
- print STDERR "not found.";
- exit 1
復(fù)制代碼
討論:
1.如果要查找的東西不止會(huì)出現(xiàn)一次,但在每個(gè)文件中不會(huì)出現(xiàn)多次,那我們就得在其它文件中繼續(xù)搜索?梢詫⑸厦婺_本中帶注釋的一行改為:
2.如果在每個(gè)文件中也可能重復(fù)出現(xiàn),那就沒辦法取巧了,只好將帶注釋的一行刪掉。你最好去用C寫個(gè)程序,或者找到其它特征在算法上提高查找的速度。
[ 本帖最后由 woodie 于 2006-2-10 21:20 編輯 ] |
|