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

new*_*php 8 php glob

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

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

我已经过滤了.和..

如何合并

glob($dir . '/*') 
Run Code Online (Sandbox Code Playgroud)

    glob('{,.}*', GLOB_BRACE)
Run Code Online (Sandbox Code Playgroud)

Hou*_*mam 10

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

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

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

  • 找不到合法的文件名`... filename.ext` (2认同)

mik*_*key 7

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

解决方案 1 - 仅 glob

这使用了一个专为跳过 '.' 而设计的 glob。和 '..' 特殊目录。它匹配以下任何内容:

  • 没有用 '.' 隐藏
  • 用“.”隐藏 但后面跟着一个非'.' 特点
  • 以 '..' 开头,但后面至少有一个字符
$globbed = glob("{*,.[!.]*,..?*}", GLOB_BRACE);
var_dump($globbed);
Run Code Online (Sandbox Code Playgroud)

解决方案 2 - globignore

这是一个在 bash 中模仿globignore行为的函数

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);
Run Code Online (Sandbox Code Playgroud)

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


Eda*_*kos 6

你试过这个吗?

glob($path. '/{,.}*', GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)


mgu*_*utt 5

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

glob('{,.}*[!.]*', GLOB_MARK | GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)

结果示例:

file
file.
file.ext
folder/
...hiddenfile
...hiddenfile.ext
..hiddenfolder/
.h
.hiddenfile
.hiddenfolder/
Run Code Online (Sandbox Code Playgroud)

附加信息
Houman 尝试以... with为目标[!.,!..],但由于这是一个字符类,因此不可能以定义的长度为目标。这意味着[!.][!..]是相同的,并且目标两个字符串不包含无限数量的点(., .., ..., .... 等)。正因为如此,我才使用[!.]。只能使用像{jpg,png}. 您可以在 php.net 评论中找到很好的解释

尽管我使用该标志GLOB_MARK为文件夹添加了结束斜杠。


jsz*_*ody 1

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

$merged = array_merge(glob($dir . '/*'), glob('{,.}*', GLOB_BRACE));
Run Code Online (Sandbox Code Playgroud)