fs.glob în Node.js

Fișiere și căi (fs, path) Node.js 22.0, stabil din 24.0

Găsește fișierele care se potrivesc cu un tipar, de exemplu "**/*.js" sau "poze/*.{jpg,png}".

Sintaxă
import { glob } from "node:fs/promises";
for await (const cale of glob(tipar[, { cwd, exclude, withFileTypes }])) { ... }
const toate = await Array.fromAsync(glob(tipar));

Ce face fs.glob

glob caută fișiere după un tipar, ca în terminal: * înseamnă orice nume dintr-un singur director, ** orice număr de subdirectoare, ? un singur caracter, iar {jpg,png} oricare dintre variante. Căutarea pornește din directorul curent sau din cwd.

Întoarce un iterator asincron, pe care îl parcurgi cu for await sau îl transformi în tablou cu Array.fromAsync. Căile sunt relative la cwd, iar ordinea nu este garantată, așa că sortează rezultatul când contează.

Opțiunea exclude scoate din rezultat căile care se potrivesc cu alte tipare (de exemplu ["node_modules/**"]) sau pentru care o funcție întoarce true. Funcția a fost adăugată în Node.js 22.0 și este stabilă din 24.0; înainte de ea se folosea pachetul glob din npm. Dacă vrei doar să verifici un șir față de un tipar, fără disc, există path.matchesGlob(cale, tipar).

Parametri

Parametru Descriere
tipar Un tipar sau un tablou de tipare ("**/*.md", ["src/**/*.mjs", "*.json"]).
cwd Directorul din care pornește căutarea. Implicit process.cwd().
exclude Tablou de tipare de exclus sau funcție (cale) => boolean.
withFileTypes Întoarce obiecte Dirent în loc de căi.

Ce returnează

Un iterator asincron de căi relative (șiruri) sau de obiecte Dirent.

Exemple

Exemplul 1: Toate fișierele Markdown din proiect

import { mkdir, writeFile, glob } from "node:fs/promises";

await mkdir("docs/ghiduri", { recursive: true });
await writeFile("README.md", "# Proiect");
await writeFile("docs/instalare.md", "");
await writeFile("docs/ghiduri/plati.md", "");
await writeFile("docs/sigla.png", "");

const markdown = await Array.fromAsync(glob("**/*.md"));
console.log(markdown.sort());

Rezultat

[ 'README.md', 'docs/ghiduri/plati.md', 'docs/instalare.md' ]

Exemplul 2: Mai multe extensii și excluderi

import { mkdir, writeFile, glob } from "node:fs/promises";

await mkdir("src/utilitare", { recursive: true });
await mkdir("node_modules/lodash", { recursive: true });
await writeFile("src/app.js", "");
await writeFile("src/utilitare/pret.js", "");
await writeFile("src/utilitare/pret.test.js", "");
await writeFile("src/stil.css", "");
await writeFile("node_modules/lodash/index.js", "");

const surse = [];
for await (const cale of glob("**/*.{js,css}", {
  exclude: ["node_modules/**", "**/*.test.js"],
})) {
  surse.push(cale);
}
console.log(surse.sort());

Rezultat

[ 'src/app.js', 'src/stil.css', 'src/utilitare/pret.js' ]

Exemplul 3: Căutare din alt director: cwd

import { mkdir, writeFile, glob } from "node:fs/promises";
import path from "node:path";

await mkdir("poze/2026", { recursive: true });
await writeFile("poze/2026/iasi.jpg", "");
await writeFile("poze/2026/cluj.png", "");
await writeFile("poze/2026/lista.txt", "");

const imagini = await Array.fromAsync(glob("**/*.{jpg,png}", { cwd: "poze" }));
console.log(imagini.sort());

console.log(path.matchesGlob("poze/2026/iasi.jpg", "poze/**/*.jpg"));

Rezultat

[ '2026/cluj.png', '2026/iasi.jpg' ]
true

Greșeli frecvente

  • Uiți await / for await: glob nu întoarce un tablou, ci un iterator asincron. Folosește Array.fromAsync(glob(...)) pentru tablou.
  • Scrii tipare cu \\ pe Windows. În tipare folosește întotdeauna / ca separator.
  • Cauți cu ** fără să excluzi node_modules și căutarea parcurge zeci de mii de fișiere. Adaugă exclude: ["node_modules/**"].
  • Încerci negarea cu "!*.test.js" în exclude. Tiparele de negare nu sunt acceptate acolo; scrie direct ce vrei să excluzi.

Comenzi înrudite

  • fs.readdir: Listează conținutul unui director: numele fișierelor, opțional cu tipul lor (withFileTypes) și cu subdirectoarele (recursive).
  • fs.stat / fs.access / existsSync: Află informații despre un fișier (tip, mărime, date), verifică dacă există și dacă poate fi citit sau scris.
  • path.parse / path.format / path.sep: Desface o cale în bucăți (root, dir, base, name, ext) și o reface din bucăți; path.sep și path.delimiter dau separatorii sistemului.
  • path.join: Lipește mai multe bucăți într-o singură cale, cu separatorul corect pentru sistemul de operare, și curăță ./ și ../.