在我的递归函数中压缩整个文件夹我有这段代码glob($ path。'/ *')给我所有文件和子文件夹匹配我的$ path。
Here我用glob读到了我甚至可以得到隐藏文件“.filename”with glob('{,。} *',GLOB_BRACE)如何合并我需要的一个表达式?我试过glob('{/,。}'',GLOB_BRACE),但只给我我试过的文件glob('{/,。,}}',GLOB_BRACE)但是我得到了疯狂的结果
我已经过滤了。和..
如何合并
glob($dir . '/*')
和
glob('{,.}*', GLOB_BRACE)
要获取所有文件夹/文件(甚至是隐藏的文件夹/文件):
$result = glob($path . '{,.}[!.,!..]*',GLOB_MARK|GLOB_BRACE);
这将阻止列出“。”或结果中的“..”。
你试过这个吗?
glob($path. '/{,.}*', GLOB_BRACE);
我在这里回答,以防其他人在看,因为这在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更容易包含更多要忽略的术语。
glob()
方法返回一个数组。所以,如果你想合并两个不同的glob
结果......
$merged = array_merge(glob($dir . '/*'), glob('{,.}*', 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;
}