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

Php 使用glob获取所有文件、所有子文件夹和所有隐藏文件,php,glob,Php,Glob,在我的Recrive函数中,我有一段代码来压缩整个文件夹 全局($path.'/*')) 提供与我的$path匹配的所有文件和子文件夹 我用glob读到的,我甚至可以用glob获得隐藏文件“.filename” 全局('{,.}*',全局大括号) 如何在一个表达式中合并我的需要? 我试过了 全局(“{/,.}*”,全局大括号) 但只给我文件 我试过了 全局(“{/,,}*”,全局大括号) 但我得到了疯狂的结果 我已经过滤了。和 如何合并 glob($dir . '/*') 及 glob()方

在我的Recrive函数中,我有一段代码来压缩整个文件夹 全局($path.'/*')) 提供与我的$path匹配的所有文件和子文件夹

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

我已经过滤了。和

如何合并

glob($dir . '/*') 

glob()
方法返回一个数组。所以如果你想合并两个不同的
glob
结果

$merged = array_merge(glob($dir . '/*'), glob('{,.}*', GLOB_BRACE));
你试过这个吗

glob($path. '/{,.}*', GLOB_BRACE);
要获取所有文件夹/文件(即使是隐藏的文件夹/文件):


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

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

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;
}

我在这里回答的情况下,其他人正在寻找,因为这似乎在谷歌高

解决方案1-仅限glob

这使用了一个专门为跳过“.”和“..”特殊目录而定制的glob。它与以下内容匹配:

  • 不是用“.”隐藏的
  • 用“.”隐藏,但后跟非“.”字符
  • 以“..”开头,但后面至少有一个字符
解决方案2-全局忽略

这是一个模拟用户行为的函数


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

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

glob('{,.}*[!.]*', GLOB_MARK | GLOB_BRACE);
示例结果:

file
file.
file.ext
folder/
...hiddenfile
...hiddenfile.ext
..hiddenfolder/
.h
.hiddenfile
.hiddenfolder/
附加信息
Houman试图使用
[!,!…]
为目标,但由于这是一个字符类,因此无法以定义长度的字符串为目标。这意味着
[!.]
[!…]
是相同的,并且目标字符串不包含无限数量的点(,,,,,,,,,,,,,,,,,,,,,,等等)。因此,我只使用了
[!]
。只有使用像
{jpg,png}
这样的大括号才能定位字符串。你找到一个新的


尽管我使用了标志向文件夹中添加了一个结束斜杠。

这找不到合法的文件名
…filename.ext
两年后-我使用了这个
glob
-唯一的解决方案,它是这里唯一正确的解决方案。这找不到名为
文件名的文件。
-以点结尾。@rexkogitans,
/{,.}*[!]*
$globbed = glob("{*,.[!.]*,..?*}", GLOB_BRACE);
var_dump($globbed);
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);
glob('{,.}*[!.]*', GLOB_MARK | GLOB_BRACE);
file
file.
file.ext
folder/
...hiddenfile
...hiddenfile.ext
..hiddenfolder/
.h
.hiddenfile
.hiddenfolder/