Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       scandir, scandirat, alphasort, versionsort - ищет записи в каталоге

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <dirent.h>

       int scandir(const char *restrict dirp,
                   struct dirent ***restrict namelist,
                   int (*filter)(const struct dirent *),
                   int (*compar)(const struct dirent **,
       const struct dirent **));

       int alphasort(const struct dirent **a, const struct dirent **b);
       int versionsort(const struct dirent **a, const struct dirent **b);

       #include <fcntl.h>          /* определения констант AT_* */
       #include <dirent.h>

       int scandirat(int dirfd, const char *restrict dirp,
                   struct dirent ***restrict namelist,
                   int (*filter)(const struct dirent *),
                   int (*compar)(const struct dirent **,
       const struct dirent **));

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       scandir(), alphasort():
           /* Since glibc 2.10: */ _POSIX_C_SOURCE >= 200809L
               || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

       versionsort():
           _GNU_SOURCE

       scandirat():
           _GNU_SOURCE

ОПИСАНИЕ

       Функция  scandir() обходит каталог dirp, вызывая filter() для каждой записи каталога. Записи, для которых
       filter() возвращает не ноль, сохраняются в строках, выделяемых с помощью malloc(3), сортируются  qsort(3)
       с  помощью  функции  сравнения  compar()  и  собираются  в массиве namelist, который выделяется с помощью
       malloc(3). Если filter равно NULL, то выбираются все записи.

       В качестве функции сравнения compar() можно использовать alphasort() и  versionsort().  Первая  сортирует
       записи  (строки  (*a)->d_name  и  (*b)->d_name)  каталога  с  помощью  strcoll(3),  а последняя с помощью
       strverscmp(3).

   scandirat()
       Системный вызов scandirat() работает  также  как  системный  вызов  scandir(),  за  исключением  случаев,
       описанных здесь.

       Если  в  dirp  задан  относительный  путь,  то  он  считается относительно каталога, на который ссылается
       файловый дескриптор dirfd (а не относительно текущего рабочего каталога  вызывающего  процесса,  как  это
       делается в scandir()).

       Если  в  dirp  задан  относительный  путь  и  значение  dirfd  равно  AT_FDCWD,  то  dirp рассматривается
       относительно текущего рабочего каталога вызывающего процесса (как scandir()).

       Если в dirp задан абсолютный путь, то dirfd игнорируется.

       Смотрите в openat(2) объяснение необходимости scandirat().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       The scandir()  function returns the number of directory entries selected.  On error, -1 is returned, with
       errno set to indicate the error.

       Функции alphasort() и versionsort() возвращают целое, меньшее,  равное  или  большее  нуля,  если  первый
       аргумент считается меньшим, равным или большим чем второй, соответственно.

ОШИБКИ

       EBADF  (scandirat())  dirp is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.

       ENOENT Путь в dirp не существует.

       ENOMEM Недостаточно памяти для завершения операции.

       ENOTDIR
              Путь в dirp не является каталогом.

       ENOTDIR
              (scandirat())   dirp  is  a  relative  pathname and dirfd is a file descriptor referring to a file
              other than a directory.

ВЕРСИИ

       versionsort()  was added in glibc 2.1.

       scandirat()  was added in glibc 2.15.

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌───────────────────────────────────────────────────────────────┬──────────────────────┬────────────────┐
       │ ИнтерфейсАтрибутЗначение       │
       ├───────────────────────────────────────────────────────────────┼──────────────────────┼────────────────┤
       │ scandir(), scandirat()                                        │ Безвредность в нитях │ MT-Safe        │
       ├───────────────────────────────────────────────────────────────┼──────────────────────┼────────────────┤
       │ alphasort(), versionsort()                                    │ Безвредность в нитях │ MT-Safe locale │
       └───────────────────────────────────────────────────────────────┴──────────────────────┴────────────────┘

СТАНДАРТЫ

       alphasort(), scandir(): 4.3BSD, POSIX.1-2008.

       Функции versionsort() и scandirat() являются расширениями GNU.

ЗАМЕЧАНИЯ

       Начиная с glibc 2.1, alphasort() вызывает strcoll(3); раньше в ней использовалась strcmp(3).

       До glibc 2.10, два аргумента alphasort() и versionsort() имели тип  const  void *.  После  стандартизации
       alphasort() в  POSIX.1-2008, тип аргумента argument стал типобезопасным const struct dirent **, и в glibc
       2.10 функция alphasort() (и нестандартная versionsort()) была приведена в соответствие со стандартом.

ПРИМЕРЫ

       Программа, показанная ниже, печатает список файлов в текущем каталоге в обратном порядке.

   Исходный код программы

       #define _DEFAULT_SOURCE
       #include <dirent.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
           struct dirent **namelist;
           int n;

           n = scandir(".", &namelist, NULL, alphasort);
           if (n == -1) {
               perror("scandir");
               exit(EXIT_FAILURE);
           }

           while (n--) {
               printf("%s\n", namelist[n]->d_name);
               free(namelist[n]);
           }
           free(namelist);

           exit(EXIT_SUCCESS);
       }

СМ. ТАКЖЕ

       closedir(3),   fnmatch(3),  opendir(3),  readdir(3),  rewinddir(3),  seekdir(3),  strcmp(3),  strcoll(3),
       strverscmp(3), telldir(3)

ПЕРЕВОД

       Русский перевод этой страницы  руководства  был  сделан  Alexander  Golubev  <fatzer2@gmail.com>,  Azamat
       Hackimov   <azamat.hackimov@gmail.com>,   Hotellook,   Nikita   <zxcvbnm3230@mail.ru>,  Spiros  Georgaras
       <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и  Иван  Павлов
       <pavia00@gmail.com>

       Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
       или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
       на man-pages-ru-talks@lists.sourceforge.net.

Linux man-pages 6.03                            5 февраля 2023 г.                                     scandir(3)