Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
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] != ' '2284 && (next->d_name[1] || next->d_name[2] != ' ')))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Число путей, которые подошли.