function find($args)
    {
        if (!is_array($args)) {
            $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
        }
        $dir = realpath(array_shift($args));
        if (!$dir) {
            return array();
        }
        $patterns = array();
        $depth = 0;
        $do_files = $do_dirs = true;
        $args_count = count($args);
        for ($i = 0; $i < $args_count; $i++) {
            switch ($args[$i]) {
                case '-type':
                    if (in_array($args[$i+1], array('d', 'f'))) {
                        if ($args[$i+1] == 'd') {
                            $do_files = false;
                        } else {
                            $do_dirs = false;
                        }
                    }
                    $i++;
                    break;
                case '-name':
                    $name = preg_quote($args[$i+1], '#');
                    // our magic characters ? and * have just been escaped,
                    // so now we change the escaped versions to PCRE operators
                    $name = strtr($name, array('\?' => '.', '\*' => '.*'));
                    $patterns[] = '('.$name.')';
                    $i++;
                    break;
                case '-maxdepth':
                    $depth = $args[$i+1];
                    break;
            }
        }
        $path = System::_dirToStruct($dir, $depth, 0, true);
        if ($do_files && $do_dirs) {
            $files = array_merge($path['files'], $path['dirs']);
        } elseif ($do_dirs) {
            $files = $path['dirs'];
        } else {
            $files = $path['files'];
        }
        if (count($patterns)) {
            $dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
            $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#';
            $ret = array();
            $files_count = count($files);
            for ($i = 0; $i < $files_count; $i++) {
                // only search in the part of the file below the current directory
                $filepart = basename($files[$i]);
                if (preg_match($pattern, $filepart)) {
                    $ret[] = $files[$i];
                }
            }
            return $ret;
        }
        return $files;
    }
function find($args)
    {
        if (!is_array($args)) {
            $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
        }
        $dir = realpath(array_shift($args));
        if (!$dir) {
            return array();
        }
        $patterns = array();
        $depth = 0;
        $do_files = $do_dirs = true;
        $args_count = count($args);
        for ($i = 0; $i < $args_count; $i++) {
            switch ($args[$i]) {
                case '-type':
                    if (in_array($args[$i+1], array('d', 'f'))) {
                        if ($args[$i+1] == 'd') {
                            $do_files = false;
                        } else {
                            $do_dirs = false;
                        }
                    }
                    $i++;
                    break;
                case '-name':
                    $name = preg_quote($args[$i+1], '#');
                    // our magic characters ? and * have just been escaped,
                    // so now we change the escaped versions to PCRE operators
                    $name = strtr($name, array('\?' => '.', '\*' => '.*'));
                    $patterns[] = '('.$name.')';
                    $i++;
                    break;
                case '-maxdepth':
                    $depth = $args[$i+1];
                    break;
            }
        }
        $path = System::_dirToStruct($dir, $depth, 0, true);
        if ($do_files && $do_dirs) {
            $files = array_merge($path['files'], $path['dirs']);
        } elseif ($do_dirs) {
            $files = $path['dirs'];
        } else {
            $files = $path['files'];
        }
        if (count($patterns)) {
            $dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
            $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#';
            $ret = array();
            $files_count = count($files);
            for ($i = 0; $i < $files_count; $i++) {
                // only search in the part of the file below the current directory
                $filepart = basename($files[$i]);
                if (preg_match($pattern, $filepart)) {
                    $ret[] = $files[$i];
                }
            }
            return $ret;
        }
        return $files;
    }
function find ( $ args ) { if ( ! is_array ( $ args ) ) { $ args = preg_split ( '/\s+/' , $ args , - 1 , PREG_SPLIT_NO_EMPTY ) ; } $ dir = realpath ( array_shift ( $ args ) ) ; if ( ! $ dir ) { return array ( ) ; } $ patterns = array ( ) ; $ depth = 0 ; $ do_files = $ do_dirs = true ; $ args_count = count ( $ args ) ; for ( $ i = 0 ; $ i < $ args_count ; $ i ++ ) { switch ( $ args [ $ i ] ) { case '-type' : if ( in_array ( $ args [ $ i + 1 ] , array ( 'd' , 'f' ) ) ) { if ( $ args [ $ i + 1 ] == 'd' ) { $ do_files = false ; } else { $ do_dirs = false ; } } $ i ++ ; break ; case '-name' : $ name = preg_quote ( $ args [ $ i + 1 ] , '#' ) ; // our magic characters ? and * have just been escaped, // so now we change the escaped versions to PCRE operators $ name = strtr ( $ name , array ( '\?' => '.' , '\*' => '.*' ) ) ; $ patterns [ ] = '(' . $ name . ')' ; $ i ++ ; break ; case '-maxdepth' : $ depth = $ args [ $ i + 1 ] ; break ; } } $ path = System :: _dirToStruct ( $ dir , $ depth , 0 , true ) ; if ( $ do_files && $ do_dirs ) { $ files = array_merge ( $ path [ 'files' ] , $ path [ 'dirs' ] ) ; } elseif ( $ do_dirs ) { $ files = $ path [ 'dirs' ] ; } else { $ files = $ path [ 'files' ] ; } if ( count ( $ patterns ) ) { $ dsq = preg_quote ( DIRECTORY_SEPARATOR , '#' ) ; $ pattern = '#(^|' . $ dsq . ')' . implode ( '|' , $ patterns ) . '($|' . $ dsq . ')#' ; $ ret = array ( ) ; $ files_count = count ( $ files ) ; for ( $ i = 0 ; $ i < $ files_count ; $ i ++ ) { // only search in the part of the file below the current directory $ filepart = basename ( $ files [ $ i ] ) ; if ( preg_match ( $ pattern , $ filepart ) ) { $ ret [ ] = $ files [ $ i ] ; } } return $ ret ; } return $ files ; }
The "find" command

Usage:

System::find($dir);
System::find("$dir -type d");
System::find("$dir -type f");
System::find("$dir -name *.php");
System::find("$dir -name *.php -name *.htm*");
System::find("$dir -maxdepth 1");

Params implmented:
$dir            -> Start the search at this directory
-type d         -> return only directories
-type f         -> return only files
-maxdepth <n>   -> max depth of recursion
-name <pattern> -> search pattern (bash style). Multiple -name param allowed

@param  mixed Either array or string with the command line
@return array Array of found files
@static
The find command