W3docs

glob()

La función glob() es una función integrada de PHP que busca archivos en un directorio usando un patrón y devuelve un array de nombres de archivos.

Esta página cubre la función glob() de PHP: qué hace, su sintaxis y sus indicadores, los comodines de estilo de shell que reconoce, y patrones prácticos como hacer coincidir múltiples extensiones, listar solo directorios, ordenar resultados y recorrer un árbol de forma recursiva. También explica los problemas comunes que confunden a los desarrolladores: archivos ocultos, la diferencia entre "sin coincidencia" y "error", y cuándo usar una herramienta diferente.

¿Qué es la función glob()?

La función glob() busca en un directorio los nombres de ruta que coincidan con un patrón de comodín de shell y los devuelve como un array. El nombre proviene del globbing de shell Unix — el mismo mecanismo que usa tu terminal cuando escribes ls *.txt.

A diferencia de una búsqueda de expresiones regulares, glob() busca coincidencias directamente en el sistema de archivos, por lo que solo devuelve rutas que realmente existen. Es la forma más rápida de responder preguntas como "dame cada .jpg de esta carpeta" o "¿qué archivos de configuración empiezan con db-?".

Sintaxis

glob(string $pattern, int $flags = 0): array|false
ParámetroDescripción
$patternEl patrón de comodín de shell a hacer coincidir (p. ej. images/*.png). Las rutas pueden ser relativas al directorio de trabajo del script o absolutas.
$flagsMáscara de bits opcional de constantes GLOB_* que modifican el comportamiento. Por defecto es 0.

Valor de retorno: un array de nombres de ruta coincidentes, un array vacío cuando nada coincide, o false en caso de un error irrecuperable (por ejemplo, un directorio que no se puede leer). Como tanto un resultado vacío como un error son "falsy", comprueba con === false cuando necesites detectar errores específicamente.

Los comodines que reconoce glob()

glob() reconoce patrones de estilo de shell, no expresiones regulares:

PatrónCoincide con
*cualquier número de caracteres (pero no un /, por lo que permanece dentro de un nivel de directorio)
?exactamente un carácter
[abc]un carácter del conjunto — aquí a, b o c
[a-z]un carácter de un rango
[!a-z]un carácter no incluido en el rango
{a,b}a o b — solo cuando se establece el indicador GLOB_BRACE

Un primer ejemplo

<?php

$files = glob('*.txt');

if ($files === false) {
    echo 'glob() failed to read the directory.' . PHP_EOL;
} else {
    foreach ($files as $file) {
        echo $file . PHP_EOL;
    }
}

Esto busca cada archivo que termine en .txt en el directorio de trabajo actual e imprime cada nombre en su propia línea. Observa la comprobación === false: distingue un error real del caso perfectamente válido de "no hay archivos .txt aquí", que simplemente produce un array vacío que el foreach omite.

Los indicadores de glob()

El segundo argumento combina una o más constantes con el operador OR bit a bit (|):

IndicadorEfecto
GLOB_MARKAgrega un / al final de cada nombre de directorio devuelto
GLOB_NOSORTDevuelve las coincidencias en el orden que proporciona el sistema de archivos, omitiendo la ordenación alfabética predeterminada (más rápido)
GLOB_NOCHECKSi nada coincide, devuelve el propio patrón en lugar de un array vacío
GLOB_NOESCAPETrata las barras invertidas literalmente en lugar de como caracteres de escape
GLOB_BRACEExpande {a,b,c} para que el patrón coincida con a, b o c
GLOB_ONLYDIRDevuelve solo las entradas que son directorios
GLOB_ERRSe detiene y devuelve false en errores de lectura en lugar de omitirlos

Hacer coincidir varias extensiones con GLOB_BRACE

<?php

$images = glob('uploads/*.{jpg,jpeg,png,gif}', GLOB_BRACE);

foreach ($images as $image) {
    echo $image . PHP_EOL;
}

GLOB_BRACE permite que una sola llamada cubra cuatro extensiones, lo cual es mucho más limpio que ejecutar glob() cuatro veces y combinar los resultados.

Listar solo subdirectorios

<?php

$dirs = glob('storage/*', GLOB_ONLYDIR);

foreach ($dirs as $dir) {
    echo $dir . PHP_EOL;
}

Con GLOB_ONLYDIR, los archivos planos dentro de storage/ se filtran, por lo que solo obtienes los directorios — útil para iterar sobre carpetas por usuario, cubos de caché y similares.

Ordenar los resultados

Por defecto, glob() devuelve las coincidencias en orden alfabético ascendente. Si necesitas un orden diferente — por ejemplo, el archivo más reciente primero — ordena el array tú mismo:

<?php

$files = glob('logs/*.log');

usort($files, static fn ($a, $b) => filemtime($b) <=> filemtime($a));

print_r($files);

Aquí usort() reordena la lista por tiempo de modificación (filemtime()), el más reciente primero. Pasa GLOB_NOSORT a glob() cuando vayas a reordenar de todas formas — evita la ordenación inicial redundante en directorios grandes.

Búsqueda recursiva

glob() en sí no desciende a subdirectorios — * nunca cruza un /. Para recorrer un árbol completo, combina glob() con GLOB_ONLYDIR y recursión:

<?php

function findFiles(string $dir, string $pattern): array
{
    $files = glob($dir . '/' . $pattern);

    foreach (glob($dir . '/*', GLOB_ONLYDIR) as $subDir) {
        $files = array_merge($files, findFiles($subDir, $pattern));
    }

    return $files;
}

print_r(findFiles('src', '*.php'));

Para árboles profundos o muy grandes, el RecursiveDirectoryIterator de PHP suele ser una mejor opción, pero este patrón es suficiente para la mayoría de las tareas cotidianas.

Problemas comunes

  • Los archivos ocultos se omiten. Un * inicial no hace coincidir archivos dot, por lo que glob('*') no devolverá .env ni .gitignore. Hazlos coincidir explícitamente con un patrón como glob('.*').
  • Array vacío vs. false. Un foreach sobre un array vacío es inofensivo, pero count(), array_map() y funciones similares advertirán si glob() devolvió false. Primero protege con === false.
  • Sin regex. glob() solo entiende comodines de shell. Para hacer coincidir expresiones regulares contra una lista existente de nombres, usa preg_grep() o prueba nombres individuales con fnmatch().
  • Rutas multiplataforma. Usa barras diagonales (/) en los patrones incluso en Windows, o construye rutas con DIRECTORY_SEPARATOR, para que el mismo código funcione en todas partes.

Cuándo usar glob() frente a otras herramientas

  • Usa glob() cuando quieras una lista rápida y ordenada de rutas que coincidan con un comodín simple en un directorio.
  • Usa scandir() cuando quieras cada entrada de un directorio (incluidos los archivos dot) y tengas intención de filtrarla tú mismo.
  • Usa opendir() / readdir() para la transmisión en memoria de directorios enormes.
  • Usa fnmatch() para probar un solo nombre contra un patrón de shell sin tocar el sistema de archivos.

Una vez que tengas una lista de rutas, pathinfo(), is_file() y file_exists() te ayudan a inspeccionar cada una. Consulta la descripción general del Sistema de archivos de PHP para tener una visión más amplia.

Conclusión

glob() es la forma más ergonómica de encontrar archivos por patrón en PHP: pasa un comodín de estilo shell y obtienes un array ordenado de rutas reales. Recuerda comprobar si hay false cuando los errores importan, usa GLOB_BRACE y GLOB_ONLYDIR para mantener los patrones ordenados, y pasa a un iterador recursivo cuando necesites buscar en todo un árbol.

Práctica

Práctica
¿Cuál es la función de glob() en PHP?
¿Cuál es la función de glob() en PHP?
Was this page helpful?