Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       fts, fts_open, fts_read, fts_children, fts_set, fts_close - обход файловой иерархии

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fts.h>

       FTS *fts_open(char *const *path_argv, int options,
                     int (*_Nullable compar)(const FTSENT **, const FTSENT **));

       FTSENT *fts_read(FTS *ftsp);

       FTSENT *fts_children(FTS *ftsp, int instr);

       int fts_set(FTS *ftsp, FTSENT *f, int instr);

       int fts_close(FTS *ftsp);

ОПИСАНИЕ

       Функции  fts  созданы  для  обхода  файловой  иерархии.  Обзорное описание: функция fts_open() возвращает
       «описатель» (с типом FTS *), который указывает  на  «поток»  файловой  иерархии.  Далее  он  используется
       другими функциями fts. Функция fts_read() возвращает указатель на структуру, описывающую один из файлов в
       файловой  иерархии.  Функция  fts_children() возвращает указатель на связанный список структур, каждая из
       которых описывает один из файлов, содержащихся в каталоге иерархии.

       В общем случае, каталоги обходятся двумя разными путями — в прямом порядке (перед тем, как обработаны  их
       потомки)  и в обратном порядке (после того, как обработаны все потомки). Файлы обрабатываются только один
       раз. Возможен «логический» обход иерархии (обрабатываются файлы, на которые указывают символьные  ссылки)
       и  «физический»  (обрабатываются  сами символьные ссылки), то есть обход иерархии сократится или какая-то
       часть будет пройдена повторно.

       В файле <fts.h> определены две структуры (связанные с ними типы). Первая — структура FTS,  представляющая
       саму иерархию файлов. Вторая — структура FTSENT, представляющая файл в иерархии файлов. Обычно, структура
       FTSENT  возвращается  для  каждого файла в файловой иерархии. В этой справочной странице понятия «файл» и
       «структура FTSENT» взаимозаменяемы.

       Структура FTSENT содержит поля, описывающие файл. На имеет, по  меньшей  мере,  следующие  поля  (есть  и
       дополнительные поля, но для реализации они должны считаться скрытыми):

           typedef struct _ftsent {
               unsigned short  fts_info;     /* flags for FTSENT structure */
               char           *fts_accpath;  /* access path */
               char           *fts_path;     /* root path */
               short           fts_pathlen;  /* strlen(fts_path) +
                                                strlen(fts_name) */
               char           *fts_name;     /* filename */
               short           fts_namelen;  /* strlen(fts_name) */
               short           fts_level;    /* depth (-1 to N) */
               int             fts_errno;    /* file errno */
               long            fts_number;   /* local numeric value */
               void           *fts_pointer;  /* local address value */
               struct _ftsent *fts_parent;   /* parent directory */
               struct _ftsent *fts_link;     /* next file structure */
               struct _ftsent *fts_cycle;    /* cycle structure */
               struct stat    *fts_statp;    /* [l]stat(2) information */
           } FTSENT;

       Эти поля определены следующим образом:

       fts_info
              Одно   из  следующих  значений  описывает  возвращённую  структуру  FTSENT  и  файл,  который  она
              представляет. За исключением каталогов без ошибок (FTS_D), все эти элементы являются конечными, то
              есть они не будут повторно обходиться, а их потомки не будут обходиться вообще.

              FTS_D  Каталог, посещаемый в прямом порядке.

              FTS_DC Каталог, вызвавший зацикливание в дереве (также будет заполнено  поле  fts_cycle  структуры
                     FTSENT).

              FTS_DEFAULT
                     Любая  структура  FTSENT,  представляющая  тип  файла,  неявно  описываемый одним из других
                     значений fts_info.

              FTS_DNR
                     Каталог, который не может быть прочитан. Это  значение  возвращается  при  ошибке,  и  поле
                     fts_errno будет заполнено тем, что вызвало ошибку.

              FTS_DOT
                     Файл  с  именем  «.»  или  «..»,  который не был указан в качестве имени файла в fts_open()
                     (смотрите FTS_SEEDOT).

              FTS_DP Каталог, посещаемый в обратном порядке. Содержимое структуры FTSENT  будет  неизменно,  как
                     если бы он посещался в прямом порядке, то есть значение поля fts_info равно FTS_D.

              FTS_ERR
                     Это  значение  возвращается  при  ошибке, и поле fts_errno будет заполнено тем, что вызвало
                     ошибку.

              FTS_F  Обычный файл.

              FTS_NS A file for which no [l]stat(2)  information was available.  The contents of  the  fts_statp
                     field  are  undefined.   This  is  an  error return, and the fts_errno field will be set to
                     indicate what caused the error.

              FTS_NSOK
                     A file for which no [l]stat(2)  information was requested.  The contents of  the  fts_statp
                     field are undefined.

              FTS_SL Символьная ссылка.

              FTS_SLNONE
                     Символьная ссылка, указывающая на несуществующий объект. В поле fts_statp содержится ссылка
                     на информацию о свойствах самой символьной ссылки.

       fts_accpath
              Путь к файлу относительно текущего каталога.

       fts_path
              Путь  к  файлу  относительно  начального  каталога  обхода.  Этот  путь  содержит в себе путь (как
              префикс), указанный в fts_open().

       fts_pathlen
              Сумма длин строк, на которые ссылается fts_path и fts_name.

       fts_name
              Имя файла.

       fts_namelen
              Длина строки, на которую ссылается fts_name.

       fts_level
              Глубина погружения в дерево иерархии, от -1 до N, на которой был обнаружен файл. Структура FTSENT,
              представляющая родительский каталог обхода (или начальный каталог), обозначена как -1, а структура
              FTSENT для самой начальной точки поиска обозначена как 0.

       fts_errno
              Если при возврате структуры FTSENT функцией fts_children() или fts_read() её поле  fts_info  равно
              FTS_DNR, FTS_ERR или FTS_NS, то в поле fts_errno содержится номер ошибки (то есть значение errno),
              обозначающее причину ошибки. В других случаях, содержимое поля fts_errno не определено.

       fts_number
              Это поле создано для использования пользовательским приложением и не изменяется функциями fts. При
              инициализации оно устанавливается в 0.

       fts_pointer
              Это поле создано для использования пользовательским приложением и не изменяется функциями fts. При
              инициализации оно устанавливается в NULL.

       fts_parent
              Указатель  на  структуру  FTSENT, которая ссылается на файл в иерархии непосредственно над текущим
              файлом, то есть на каталог, членом которого является текущий файл. Родительский каталог  начальной
              точки  поиска также может быть доступен, однако инициализируются только поля fts_level, fts_number
              и fts_pointer.

       fts_link
              При возврате функции fts_children() поле fts_link указывает на  следующую  структуру  в  связанном
              списке  (заканчивающемся  NULL) содержимого каталога. В другим случаях содержимое поля fts_link не
              определено.

       fts_cycle
              Если каталог вызывает зацикливание иерархии (смотрите FTS_DC), либо  из-за  жёсткой  ссылки  между
              двумя  каталогами,  либо  из-за символьной ссылки, указывающей на каталог, то поле fts_cycle будет
              указывать на структуру FTSENT в иерархии,  которая  ссылается  на  тот  же  файл,  что  и  текущая
              структура FTSENT. В других случаях содержимое поля fts_cycle не определено.

       fts_statp
              A pointer to [l]stat(2)  information for the file.

       Для  всех  путей  всех  файлов  в  иерархии  используется  единый  буфер.  Следовательно, поля fts_path и
       fts_accpath гарантировано завершаются null только для файла, который был возвращён fts_read()  последним.
       Для  использования  этих  полей  для  обращения к любым файлам, представленным другими структурами FTSENT
       необходимо, чтобы буфер пути был изменён в соответствии с информацией, содержащейся  в  поле  fts_pathlen
       структуры  FTSENT.  Любое  изменение должно быть обратно восстановлено перед дальнейшими попытками вызова
       fts_read(). Поле fts_name всегда завершается null.

   fts_open()
       Функция fts_open() ожидает указатель на массив символьных указателей,  обозначающих  один  или  несколько
       путей,  образующих  логическую  файловую  иерархию,  по  которой  будет  проводиться обход. Массив должен
       заканчиваться указателем null.

       Есть несколько флагов, должен быть указан хотя бы один  (либо  FTS_LOGICAL,  либо  FTS_PHYSICAL).  Флаги,
       выбираемые с помощью логического объединения, имеют следующие значения:

       FTS_LOGICAL
              This  option causes the fts routines to return FTSENT structures for the targets of symbolic links
              instead of the symbolic links themselves.  If this option is set,  the  only  symbolic  links  for
              which  FTSENT  structures are returned to the application are those referencing nonexistent files:
              the fts_statp field is obtained via stat(2)  with a fallback to lstat(2).

       FTS_PHYSICAL
              This option causes the fts routines to return FTSENT  structures  for  symbolic  links  themselves
              instead  of  the  target  files  they  point to.  If this option is set, FTSENT structures for all
              symbolic links in the hierarchy are returned to the application: the fts_statp field  is  obtained
              via lstat(2).

       FTS_COMFOLLOW
              This  option  causes  any symbolic link specified as a root path to be followed immediately, as if
              via FTS_LOGICAL, regardless of the primary mode.

       FTS_NOCHDIR
              As a performance optimization, the  fts  functions  change  directories  as  they  walk  the  file
              hierarchy.   This  has  the side-effect that an application cannot rely on being in any particular
              directory during the traversal.  This option turns off this optimization, and  the  fts  functions
              will  not change the current directory.  Note that applications should not themselves change their
              current directory and try to access files unless FTS_NOCHDIR is specified and  absolute  pathnames
              were provided as arguments to fts_open().

       FTS_NOSTAT
              By  default,  returned  FTSENT structures reference file characteristic information (the fts_statp
              field) for each file visited.  This option relaxes that requirement as a performance optimization,
              allowing the fts functions to set the fts_info field to FTS_NSOK and leave  the  contents  of  the
              fts_statp field undefined.

       FTS_SEEDOT
              По  умолчанию,  все  файлы с именами «.» или «..», обнаруженные в файловой иерархии, игнорируются,
              если они не указаны как параметры пути в fts_open(). Данный флаг принуждает функции fts для  таких
              файлов возвращать структуры FTSENT.

       FTS_XDEV
              Этот  флаг  предотвращает  функции  fts  от  вхождения в каталоги, которые имеют номер устройства,
              отличный от файла, с которого начался обход.

       В параметре compar() указывается определяемая пользователем функция,  которая  может  использоваться  для
       упорядочивания  обхода  иерархии.  В  качестве  параметров  ей  требуется  два  указателя на указатели на
       структуры FTSENT, и она должна возвращать отрицательное значение, ноль  или  положительное  значение  для
       того,  чтобы  показать,  расположен  ли  файл,  на который указывает первый параметр, перед (относительно
       текущего упорядочивания), на одном уровне или после файла, на который  указывает  второй  параметр.  Поля
       fts_accpath,  fts_path  и  fts_pathlen  структур  FTSENT  могут  быть  никогда  не использованы при таком
       сравнении.  Если  значение  поля  fts_info  равно  FTS_NS  или  FTS_NSOK,  то  поле  fts_statp  может  не
       использоваться.  Если  значение  параметра  compar() равно NULL, то порядок обхода каталогов определяется
       параметрами, указанными в path_argv для корневых путей, и в порядке, перечисленном в каталоге, для  всего
       остального.

   fts_read()
       Функция  fts_read()  возвращает  указатель  на  структуру  FTSENT,  описывающую файл в иерархии. Каталоги
       (корректно считанные и не образующие зацикливаний), посещаются как минимум дважды — первый раз  в  прямом
       прохождении  и  второй  раз  в  обратном. Все остальные файлы посещаются минимум один раз (жёсткие ссылки
       между каталогами, не образующие зацикливаний, или символьные ссылки на символьные ссылки могут привести к
       тому, что файлы будут посещаться более одного раза, а каталоги более двух раз).

       If all the members of the hierarchy have been returned, fts_read() returns NULL and sets errno to 0.   If
       an error unrelated to a file in the hierarchy occurs, fts_read()  returns NULL and sets errno to indicate
       the  error.  If an error related to a returned file occurs, a pointer to an FTSENT structure is returned,
       and errno may or may not have been set (see fts_info).

       Структуры FTSENT, возвращаемые fts_read(), могут быть перезаписаны после  вызова  fts_close()  в  том  же
       файловом  потоке  иерархии  или  после  вызова  fts_read() в том же файловом потоке иерархии, если они не
       представляют файл типа «каталог»; в этом случае они не  будут  перезаписаны  до  тех  пор,  пока  функция
       fts_read() не вернёт структуру FTSENT при выполнении обхода в обратном порядке.

   fts_children()
       Функция  fts_children()  возвращает  указатель  на  структуру  FTSENT, описывающую первый член связанного
       списка  (оканчивающегося  NULL)  файлов  в  каталоге,  представленного  структурой  FTSENT,  возвращённой
       fts_read()  последней.  Список  связан  через  поле  fts_link структуры FTSENT, и упорядочен определённой
       пользователем  функцией  сравнения,  если  таковая  существует.  Повторные  вызовы  fts_children()  будут
       пересоздавать этот связанный список.

       As  a special case, if fts_read()  has not yet been called for a hierarchy, fts_children()  will return a
       pointer to the files in the logical directory specified to fts_open(), that is, the  arguments  specified
       to  fts_open().   Otherwise,  if  the  FTSENT  structure  most  recently returned by fts_read()  is not a
       directory being visited in preorder, or the directory does not contain any files, fts_children()  returns
       NULL and sets errno to zero.  If an error occurs, fts_children()  returns NULL and sets errno to indicate
       the error.

       Структура  FTSENT,  возвращаемая  fts_children(),  может  быть  перезаписана после вызова fts_children(),
       fts_close() или fts_read() в том же файловом потоке иерархии.

       Параметр instr может принимать значение нуля или одного из следующих значений:

       FTS_NAMEONLY
              Необходимы только имена файлов. Содержимое всех полей в возвращаемом связанном списке структур  не
              определено, за исключением полей fts_name и fts_namelen.

   fts_set()
       Функция fts_set() позволяет пользовательскому приложению определять дальнейшую обработку файла f в потоке
       ftsp. При успешном выполнении функция fts_set() возвращает 0 и -1 при ошибке.

       Значением аргумента instr может быть 0 («ничего не делать») или одно из следующих значений:

       FTS_AGAIN
              Повторно посетить файл; файл любого типа может быть повторно посещён. Последующий вызов fts_read()
              возвратит   файл,   к   которому   идёт  обращение.  Поля  fts_stat  и  fts_info  структуры  будут
              переинициализированы в этот момент, но никакие поля больше не будут изменены. Этот параметр значим
              только для последнего возвращённого файла из  fts_read().  Обычно  его  используют  при  посещении
              каталогов  в  обратном  порядке;  в  этом  случае каталог посещается повторно (в прямом и обратном
              порядке), а также все его потомки.

       FTS_FOLLOW
              Рассматриваемый файл должен  быть  символьной  ссылкой.  Если  рассматриваемый  файл  —  последний
              возвращённый  fts_read(),  то  следующий  вызов  fts_read()  возвратит  файл  с изменёнными полями
              fts_info и fts_statp, в которых будут отражать повторно инициализированные данные цели  символьной
              ссылки,  а  не  самой  символьной  ссылки.  Если  рассматриваемый  файл  —  последний возвращённый
              fts_children(), то поля fts_info и fts_statp структуры при возврате из fts_read()  будут  отражать
              данные  цели символьной ссылки, а не самой символьной ссылки. В любом случае, если цель символьной
              ссылки не существует, то поля возвращаемой структуры не будут  меняться,  а  поле  fts_info  будет
              равно FTS_SLNONE.

              Если цель ссылки — каталог, то выполняется возврат при прямом прохождении, после него возврат всех
              его потомков, после чего выполняется возврат в обратном порядке.

       FTS_SKIP
              Не  посещать  потомков  данного  файла.  Файл  может  быть  одним  из  последних возвращённых либо
              fts_children(), либо fts_read().

   fts_close()
       Функция fts_close() закрывает поток файловой иерархии,  на  который  указывает  ftsp,  и  делает  текущим
       каталогом  тот,  который  был  до  вызова  fts_open()  для открытия ftsp. При успешном выполнении функция
       fts_close() возвращает 0 и -1 при ошибке.

ОШИБКИ

       Функция fts_open() может завершиться с ошибкой и назначить переменной  errno  значения,  перечисленные  в
       open(2) и malloc(3).

       In addition, fts_open()  may fail and set errno as follows:

       ENOENT Any element of path_argv was an empty string.

       Функция  fts_close()  может  завершиться с ошибкой и назначить переменной errno значения, перечисленные в
       chdir(2) и close(2).

       The functions fts_read()  and fts_children()  may fail and set errno for any of the errors specified  for
       chdir(2), malloc(3), opendir(3), readdir(3), and [l]stat(2).

       Кроме  того,  функции  fts_children(),  fts_open()  и  fts_set()  могут завершиться с ошибкой и назначить
       переменной errno следующие значения:

       EINVAL Некорректное значение options или instr.

АТРИБУТЫ

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

СТАНДАРТЫ

       Отсутствуют.

ИСТОРИЯ

       glibc 2.  4.4BSD.

ОШИБКИ

       Before glibc 2.23, all of the APIs described in this man page are not safe when compiling a program using
       the LFS APIs (e.g., when compiling with -D_FILE_OFFSET_BITS=64).

СМОТРИТЕ ТАКЖЕ

       find(1), chdir(2), lstat(2), stat(2), ftw(3), qsort(3)

ПЕРЕВОД

       Русский перевод этой страницы  руководства  разработал(и)  Azamat  Hackimov  <azamat.hackimov@gmail.com>,
       Dmitry    Bolkhovskikh    <d20052005@yandex.ru>,    Yuri   Kozlov   <yuray@komyakino.ru>,   Иван   Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот перевод является свободной программной документацией; он распространяется на условиях  общедоступной
       лицензии  GNU  (GNU  General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите  об  этом
       разработчику(ам)   по   его(их)  адресу(ам)  электронной  почты  или  по  адресу  списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                           fts(3)