Многие пользователи ОС Windows знают, что тип файла определяется его расширением. В Unix-подобных системах дела обстоят немного по другому. Во первых, надо понимать, что в Linux все является файлом. Во вторых, ОС в основном наплевать на имя файла, а предназначение файла определяется по его внутренней структуре. На сколько это удобно или не удобно судить не мне, но со временем к этому привыкаешь.
В большинстве случаев, в файловой системе определены семь типов файлов. Даже разработчики при попытке добавить в систему что-нибудь новое и необычное, им приходится маскировать это под эти семь типов. Определить тип файла можно командой file. Эта команда не только определяет стандартный тип файла, но и распознает их форматы.
$file 1.tmp
1.tmp: ASCII text //обычный текстовый файл, содержащий текст в формате ASCII
$file /etc
/etc: directory // файл каталога.
Еще одним вариантом узнать тип файла, можно использовав команду
ls -ld.
$ls -ld 1.tmp
-rw-r--r-- 1 root root 61 May 14 00:38 1.tmp
$ls -ld /etc
drwxr-xr-x 90 root root 4096 Jun 18 07:50 /etc
В этом случае, на тип файла указывает первый символ в выводе. "-" - указывает на то что это просто файл. "d"- говорит нам, что /etс - это каталог.
Давайте, теперь рассмотрим каждый тип поподробнее.
Обычный файл
Обычный файл - это просто последовательность байтов. В Linux все равно текстовый или исполняемый файл перед ним, а может даже и картинка. Во всех этих случаях - это будет обычный файл, а остальные типы будут считаться специальными. В выводе ls обычные файлы обозначаются символом минус "-". Создать обычный файл можно командами touch, cp, >>, различными редакторами и т.д.. Удалить обычный файл можно командой rm.
Каталог
Каталоги - это особый тип файла, который хранит ссылки на другие файлы. Редактировать эти файлы напрямую невозможно. Записью данных в эти файлы занимается ядро системы на основе получаемых данных, в том числе и от пользователя. Например, когда вы отдаете команду на создание файла в каталоге, ядро создает связь между указанным именем создаваемого файла и их индексным дескриптором ( настоящее имя, которым оперирует ОС).
Распознать файл каталога можно по букве d. Создается каталог командой mkdir. Удалить каталог можно командой rmdir, при условии, что в нем не хранится файлов, либо командой rm -r.
Жесткие ссылки
Про жесткие ссылки писал ранее, можно прочитать в статье "Linux. Ссылки жесткие и не очень".
Действительное имя файла хранится в родительском каталоге, а не в самом файле. На файл можно ссылаться из нескольких каталогов одновременно и даже из нескольких элементов одного и того же каталога, при этом у всех этих ссылок могут быть разные имена. Непосредственно сам файл существует, пока на него ведет хотя бы одна жесткая ссылка.
Создается жесткая ссылка с помощью команды ln, синтаксис у нее один в один как у cp. Удаляется командой rm. По сути все файлы, которые мы видим в каталогах - это и есть жесткие ссылки. Количество существующих ссылок на файл можно увидеть в выводе команды ls -l.
$ls -l
-rw-r--r-- 2 root root 61 May 14 00:38 1.tmp
-rw-r--r-- 2 root root 61 May 14 00:38 2.tmp
В данном примере можем увидеть две жесткие ссылки на один и тот же файл. Цифра 2 перед именем владельца именно об этом и говорит.
Файлы символьных и блочных устройств.
Файлы устройств позволяют программам получать доступ к устройствам. Ядро включает специальные драйверы, которые во всех деталях знают, как работать с определенным устройством. Главное отличать файлы устройств и драйверы. Файлы устройств сами по себе не являются драйверами а служат "тоннелем" между драйвером и самим устройством.
Большой разницы между символьным и блочным устройством нет. В основном отличие заключается в том, что к символьным устройствам обращение происходит последовательно (символ за символом), например терминал, а к блочным устройствам в произвольном порядке, причем блоками разного размера, например жесткие диски.
Создаются такие файлы командой mknod, удаляются командой rm. Файлы символьных устройств обозначаются буквой "с", блочных - "b".
Локальные сокеты
Сокеты необходимы для соединения одних процессов с другими, не подвергаясь влиянию других процессов. Локальные сокеты создаются с помощью системного вызова socket. Когда соединение закрыто, его можно удалить командой rm или с помощью системного вызова unlink. Обозначается в выводе ls буквой "s".
Именованные каналы
По сути это те же самые сокеты, но в отличии от оных, каналы работают только в одну сторону. То есть через канал один процесс передает данные второму, но не наоборот. Такие каналы еще называют файлами FIFO (First In, First Out - первый пришел, первый обработан). Создаются каналы, командой mknod, удаляются rm, обозначаются "p".
Символические ссылки
Про символические ссылки можно почитать в статье "Linux . Ссылки жесткие и не очень."
Символическая ссылка позволяет указывать псевдоним вместо имени файла. Отличие от жесткой ссылки заключается в том, что символическая указывает на файл по имени, а жесткая указывает непосредственно на индексный дескриптор файла. Поэтому при удалении файла, ссылка не удаляется, а просто ведет в никуда. Про такие ссылки еще говорят, что они битые.
Создаются символические ссылки с помощью команды ln -s, удаляются командой rm. Обозначаются такие ссылки буквой "l".
Заключение
Вот такие типы файлов есть в системе Linux. На особенностях каждого типа остановимся в других статьях. Есть что добавить? - Добро пожаловать в комментарии ниже. Ну и не забывайте жамкать кнопку "подписаться" ниже 👇, вам пустяк, а мне приятно.