struct dirent dp;DIR *dir;char pattern[100];/* ...Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ°Π±Π»ΠΎΠ½, ΠΎΡΠΊΡΡΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³, ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ... */while ((dp = readdir(dir)) != NULL) {Β if (fnmatch(pattern, dir->d_name, FNM_PERIOD) == 0)Β /* ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ°Π±Π»ΠΎΠ½Ρ */Β elseΒ continue; /* Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ */}GNU
lsfnmatch()--ignorelsfile_interesting()ls.Ρ2269 /* ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ Π½ΠΎΠ»Ρ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» Π² 'next' Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½. */22702271 static int2272 file_interesting(const struct dirent *next)2273 {2274Β register struct ignore_pattern* ignore;22752276Β for (ignore = ignore_patterns; ignore; ignore = ignore->next)2277Β Β if (fnmatch(ignore->pattern, next->d_name, FNM_PERIOD) == 0)2278Β Β Β return 0;22792280Β if (really_all_files2281Β Β || next->d_name[0] !=2282Β Β || (all_files2283Β Β && next->d_name[1] != '\0 '2284Β Β && (next->d_name[1] || next->d_name[2] != '\0')))2285Β Β return 1;22862287 Β return 0;2288 }Π¦ΠΈΠΊΠ» Π² ΡΡΡΠΎΠΊΠ°Ρ 2276β2278 ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² Π΄Π»Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, ΡΠ°ΠΉΠ» Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΈ
file_interesting()ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
all_files-Π...really_all_files-Π°-Π...if (/* <i>ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΡ
ΠΈΠΌΠ΅Π½ΠΈ (-Π°)</i> */Β OR /* <i>ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ ΡΠΎΡΠΊΠ°</i> */Β OR (/* <i>ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Ρ ΡΠΎΡΠΊΠΎΠΉ (-Π)</i> */Β AND /* <i>Π² ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²</i> */Β AND (/* <i>Π²ΡΠΎΡΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π΅ ΡΠΎΡΠΊΠ°</i> */Β Β OR /* <i>ΡΡΠ΅ΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΈΠΌΡ</i> */)))Β return TRUE;ΠΠΠΠΠ§ΠΠΠΠ.
fnmatch()12.7.2. Π Π°ΡΠΊΡΡΡΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°:
glob()globfree()Π€ΡΠ½ΠΊΡΠΈΠΈ
glob()globfree()fnmatch()#include <glob.h> /* POSIX */int glob(const char *pattern, int flags,int (*errfunc)(const char *epath, int eerrno), glob_t *pglob);void globfree(glob_t *pglob);Π€ΡΠ½ΠΊΡΠΈΡ
glob()pattern/usr/*/*.soconst char *patternΠ¨Π°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΡΠ°ΡΠΊΡΡΠ²Π°Π½ΠΈΡ.
int flagsΠ€Π»Π°Π³ΠΈ, ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ
glob()int (*errfunc)(const char *epath, int eerrno)Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ . ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π²Π½ΡΡΡΡΡ
NULL(*errfunc)()flagsGLOB_ERRglob()(*errfunc)()opendir()readdir()stat()glob_t *pglobΠ£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ
glob_tglob_tglob()typedef struct {Β /* POSIX */Β size_t gl_pathc; /* Π§ΠΈΡΠ»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ
ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΠΏΡΡΠ΅ΠΉ */Β char **gl_pathv; /* Π‘ΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΠΏΡΡΠ΅ΠΉ */Β size_t gl_offs;Β /* Π‘Π»ΠΎΡΡ Π΄Π»Ρ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² gl_pathv */} glob_t;size_t gl_pathcΠ§ΠΈΡΠ»ΠΎ ΠΏΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΠΎΡΠ»ΠΈ.