cd
в этот каталог, затем используйте эту команду, чтобы отметить только файлы:
find . -type f -exec touch {} \;
или эту команду, чтобы отметить даже каталоги:
find . -exec touch {} \;
После выполнения файлы (и папки, если вы выберете вторую команду) будут помечены как только что измененные, и их содержимое не будет изменено.
Преимущество этой команды в том, что она будет рекурсивной, даже подкаталоги и файлы в этих подкаталогах будут помечены как измененные.
Давайте попробуем вас разобрать. В 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.
Команды 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
содержит расширенные атрибуты.