使用PHP替换grep
在服务器上要查一些字符串,用grep命令太慢了,有一些特定目录(比如log)下面文件太多,虽然可以用 -v 排除特殊目录,不过按我的理解,应该是先把结果找出来,再排除特定目录,应该也会把log目录过一遍,所以用php写了一个替代脚本,脚本如下:
//要查找的字符串
$needGrepStrArr = array('secstg','test','console.log');
//需要排除的文件类型
$fileType = array('png','jpg','gif','zip');
/**
* @access public
* @param mixed $arg1 要查找的文件目录
* @return bool
*/
function grep($dir)
{
if(is_dir($dir)){
$child_dirs = scandir($dir);
foreach($child_dirs as $child_dir){
//排除特定目录
if($child_dir != '.' && $child_dir != '..' && $child_dir !='logs'){
if(is_dir($dir.'/'.$child_dir)){
grep($dir.'/'.$child_dir);
}else{
$fileName = $dir.'/'.$child_dir;
//去除'//'
$fileName = str_replace('//','/',$fileName);
checkFile($fileName,true);
}
}
}
return true;
}else{
return false;
}
}
/**
* @access public
* @param mixed $arg1 要检查的文件名
* @param mixed $arg2 大小写是否敏感
* @return bool
*/
function checkFile($fileName,$isUpper=false){
Global $needGrepStrArr;
Global $fileType;
if(file_exists($fileName)){
if(in_array(pathinfo($fileName,PATHINFO_EXTENSION),$fileType)){
return;
}
$contents = file_get_contents($fileName);
if($contents){
foreach($needGrepStrArr as $needGrepStr){
if($isUpper){
$contents = strtoupper($contents);
$needGrepStr = strtoupper($needGrepStr);
}
if(strstr($contents,$needGrepStr)){
echo $needGrepStr .' in '.$fileName.PHP_EOL;
}
}
}
}
return true;
}
grep('/var/www/html/ci/');
虽然和grep命令还有一些差距,但是用来查找一些普通字符串也是够用了,如果需要用正则查找的话,把对应的配置方法改成正则就行