使用glob获取所有文件的所有子文件夹和所有隐藏文件

时间:2014-01-03 14:45:48

标签: php glob

在我的recurive函数中压缩整个文件夹我有这段代码     glob($ path。'/ *') 这给了我所有匹配我的$ path的文件和子文件夹。

Here我用glob读到了我甚至可以获得隐藏文件“.filename”     glob('{,。} *',GLOB_BRACE) 如何合并我需要的一个表达式? 我试过了     glob('{/,。}'',GLOB_BRACE) 但只给我文件 我试过了     glob('{/,。,}}',GLOB_BRACE) 但我得到了疯狂的结果

我已经过滤了。和..

如何合并

glob($dir . '/*') 

    glob('{,.}*', GLOB_BRACE)

6 个答案:

答案 0 :(得分:10)

获取所有文件夹/文件(甚至是隐藏的文件夹/文件):

$result = glob($path . '{,.}[!.,!..]*',GLOB_MARK|GLOB_BRACE);

这将阻止列出"。"或" .."在结果中。

答案 1 :(得分:6)

你试过这个吗?

glob($path. '/{,.}*', GLOB_BRACE);

答案 2 :(得分:3)

我正在这里回答,以防其他人在看,因为这在Google上看起来很高。

解决方案1 ​​ - 仅限glob

这使用了专为跳过'。'而定制的glob。和'..'特殊目录。它符合以下任何内容:

  • 未隐藏“。”
  • 隐藏着'。'但是遵循非''。字符
  • 以'..'开头,但至少有一个字符
$globbed = glob("{*,.[!.]*,..?*}", GLOB_BRACE);
var_dump($globbed);

解决方案2 - globignore

这是模仿globignore in bash行为的函数。

function globignore(array $ignore, $glob, $glob_flags = 0)
{
    $globbed = glob($glob, $glob_flags);
    return array_filter($globbed, function ($f) use ($ignore)
    {
        $base = basename($f);
        foreach($ignore as $i)
        {
            if ($i == $base) return false;
        }
        return true;
    });
}
$globbed = globignore(['.','..'], "{*,.*}", GLOB_BRACE);
var_dump($globbed);

它们似乎在我的系统上几乎完全相同的时间执行。 解决方案1 ​​需要更少的代码,但解决方案2 更容易包含更多要忽略的术语。

答案 3 :(得分:1)

glob()方法返回一个数组。因此,如果您想合并两个不同的glob结果......

$merged = array_merge(glob($dir . '/*'), glob('{,.}*', GLOB_BRACE));

答案 4 :(得分:1)

这将返回隐藏的文件和文件夹,但不返回...

glob($dir . '/{,.}*[!.]', GLOB_MARK | GLOB_BRACE);

它代替Houmams回答也返回有效的filname ...file.ext

经过$dir="test/"和以下文件的测试:

test/.hiddenfolder/
test/folder/
test/...file
test/...file.ext
test/.h
test/.hiddenfile
test/file
test/file.ext

其他信息
Houman尝试使用.定位..[!.,!..],但是由于这是一个字符类,因此无法定位定义长度的字符串。这意味着[!.][!..]是相同的,并且都针对不包含无限数量的点(。,..,...,....等)的两个字符串。因此,我仅使用[!.]。仅使用{jpg,png}之类的花括号即可定位字符串。您会发现一个good explanation in the php.net comments

答案 5 :(得分:0)

可能你已经找到了解决方案,但是如果你正在寻找一种方法来提供文件和目录,递归并处理隐藏文件,这就是我得到的:

function rglob($pattern, $flags = 0) {
    $files = glob($pattern, $flags);

    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $files = array_merge($files, $this->rglob($dir.'/'.basename($pattern), $flags));
    }

    return $files;
}