Как команды, такие как ls или stat, различают тип файла?

cd в этот каталог, затем используйте эту команду, чтобы отметить только файлы:

find . -type f -exec touch {} \;

или эту команду, чтобы отметить даже каталоги:

find . -exec touch {} \;

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

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

1
24.12.2016, 05:57
2 ответа

Давайте попробуем вас разобрать. В inode есть 16-битное поле, возвращаемое stat / lstat (и 64-битными вариантами) в st_mode. Из этих 9 битов используются права доступа rwxrwxrwx, еще 3 - бит фиксации , бит установки идентификатора группы (sgid) и бит идентификатора пользователя (suid) . Остальные 4 бита используются для кодирования некоторой информации о типе. Это может сказать, что это обычный файл, каталог, блочное или символьное устройство, именованный канал и т. Д.

Итак, если вы создаете каталог, эти 4 бита говорят, что это каталог. Вы можете увидеть это в выводе strace ...

lstat("testdir/", {st_mode=S_IFDIR|0775, st_size=4096, ...})
                           ^^^^^^^ 4 bits showing the type is directory
                                   ^ 3 bits (this is octal) for suid/sgid/sticky
                                    ^^^ rwxrwxrwx info.
6
27.01.2020, 23:13

Команды ls , stat или даже файл внутренне используют C stat () для сбора подробностей. Здесь определены структуры. Если вы проверите файлы статистики:

  • /usr/include/bits/stat.h
  • /usr/include/linux/stat.h

Определены следующие биты:

/* Encoding of the file mode.  */

#define __S_IFMT        0170000 /* These bits determine file type.  */

/* File types.  */
#define __S_IFDIR       0040000 /* Directory.  */
#define __S_IFCHR       0020000 /* Character device.  */
#define __S_IFBLK       0060000 /* Block device.  */
#define __S_IFREG       0100000 /* Regular file.  */
#define __S_IFIFO       0010000 /* FIFO.  */
#define __S_IFLNK       0120000 /* Symbolic link.  */
#define __S_IFSOCK      0140000 /* Socket.  */

the stat function will check the POSIX macros and compare to see if it is a regular file/ directory

#define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)
#define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)
#define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)
#define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)
#define S_ISSOCK(m)     (((m) & S_IFMT) == S_IFSOCK)

Вот как st_mode получает эти значения S_IFDIR и S_IFREG .

К вашему сведению ... Теперь к одному главному вопросу о том, как inode идентифицируют тип файла:

Для файловой системы XFS структура данных inode разделена на 3 части:

  • di_core (96 байтов )
  • di_u вилка данных
  • di_a вилка расширенных атрибутов

Ядро содержит то, что представляет индексный дескриптор, данные статистики и информацию, описывающую вилки данных и атрибутов. Здесь тип файла контролируется di_core.di_mode (например, обычный файл, каталог, ссылка и т. Д.).

«Ответвление данных» di_u содержит обычные данные, относящиеся к индексному дескриптору.

«Ответвление атрибутов» di_a содержит расширенные атрибуты.

1
27.01.2020, 23:13

Теги

Похожие вопросы