- Файлы в Linux
- В Linux нет расширений
- Linux чувствителен к регистру
- Пробелы в именах файлов
- Кавычки
- Управляющие символы
- Скрытые файлы и каталоги
- Что нужно запомнить
- Команды
- Идеи
- Практические задания
- Типы файлов Linux
- Обычные файлы (-)
- Каталоги (d)
- Символьные ссылки (l)
- Символьные (c) и блочные устройства (b)
- Сокеты (s) и каналы (p)
- Команда file
Файлы в Linux
Первое, что вам нужно понять: в Linux на техническом уровне все на самом деле является файлом. Текстовый файл — это файл, папка — это файл, ваша клавиатура — это файл (его система может только читать), ваш монитор — это файл (в него система может только записывать) и т. д. Конечно, эти знания не слишком помогут с тем, что мы делаем сейчас, однако они позволяют лучше понимать поведение Linux.
В Linux нет расширений
Это немного непривычно, но со временем все станет понятнее. Расширение файла обычно представляет собой набор из 2–4 символов после точки в конце файла, который обозначает тип файла. Ниже приведены распространенные расширения:
- file.exe — исполняемый файл.
- file.txt — простой текстовый файл.
- file.png, file.gif, file.jpg — изображение.
В других системах, таких как Windows, расширение важно: система использует его для определения типа файла. Linux игнорирует расширение и просматривает файл, чтобы определить, какой это тип. Так, например, у нас может быть файл photo.png с какой-то фотографией. Мы можем переименовать файл в photo.txt или просто в photo, и Linux все равно обработает этот файл как файл с изображением. Поэтому иногда бывает трудно определить, к какому типу относится конкретный файл. К счастью, есть команда под названием file , с помощью которой это можно выяснить.
Вам, наверное, интересно, почему в качестве аргумента мы указали путь к файлу вместо его имени. Если вы помните из предыдущей статьи, всякий раз, когда мы указываем файл или каталог в командной строке, на самом деле мы указываем их путь. Кроме того, поскольку каталоги (как упоминалось выше) на самом деле являются просто особым типом файлов, было бы точнее сказать, что путь — это средство доступа к определенному месту в системе, и это местоположение является файлом.
Linux чувствителен к регистру
Это часто вызывает проблемы у людей, которые плохо знакомы с Linux. В других системах, таких как Windows, регистр не учитывается при обращении к файлам. С Linux не так. То есть можно иметь два или более файлов и каталогов с одинаковыми именами, но буквами разного регистра. И это будут разные файлы.
1. [email protected]: ls Documents
2. FILE1.txt File1.txt file1.TXT
3. …
4. [email protected]: file Documents/file1.txt
5. Documents/file1.txt: ERROR: cannot open ‘file1.txt’ (No such file or directory)
Параметры командной строки тоже чувствительны к регистру. Например, для команды ls есть две опции s и S , которые делают совершенно разные вещи. Распространенная ошибка — нам нужна опция, которая пишется в верхнем регистре, а мы пишем ее в нижнем и удивляемся, почему результат не соответствует нашим ожиданиям.
Пробелы в именах файлов
Пробелы в именах файлов и каталогов вполне допустимы, но с ними нужно быть немного осторожнее. Как вы помните, пробел в командной строке разделяет элементы. С его помощью мы узнаем, что является именем программы, а что — аргументами командной строки. Если бы мы хотели перейти в каталог под названием Holiday photos, то способ из примера ниже не сработал бы:
1. [email protected]: ls Documents
2. FILE1.txt File1.txt file1.TXT Holiday Photos
3. …
4. [email protected]: cd Holiday Photos
5. bash: cd: Holiday: No such file or directory
Дело в том, что Holiday Photos рассматривается как два аргумента командной строки. Команда cd переходит в каталог, указанный только первым аргументом. Чтобы обойти это, нам нужно указать терминалу, что мы хотим, чтобы Linux рассматривал Holiday Photos как один аргумент командной строки. Есть два способа сделать это.
Кавычки
Первый способ — использовать кавычки. Можно использовать одинарные или двойные. Позже мы увидим, что между ними есть небольшая разница, но пока это несущественно. Все, что находится внутри кавычек, считается одним элементом.
1. [email protected]: cd 'Holiday Photos'
2. [email protected]: pwd
3. /home/karpaff/Documents/Holiday Photos
Управляющие символы
Другой способ — использовать так называемый управляющий символ, то есть обратную косую черту \ . Обратная косая черта экранирует (или аннулирует) особое значение следующего за ней символа.
1. [email protected]: cd Holiday\ Photos
2. [email protected]: pwd
3. /home/karpaff/Documents/Holiday Photos
В приведенном выше примере пробел между Holiday и Photos обычно имеет особое значение: он разделяет их на отдельные аргументы командной строки. Поскольку мы поместили перед ним обратную косую черту, это особое значение было отменено.
Примечание. В предыдущем разделе мы узнали о заполнении строки нажатием клавиши Tab. Если вы используете это до того, как столкнетесь с пробелом в имени каталога, терминал автоматически отключит любые пробелы в имени.
Скрытые файлы и каталоги
На самом деле в Linux есть очень простой и элегантный механизм для указания того, что файл или каталог скрыт. Если имя файла или каталога начинается с . (точки), то файл считается скрытым. Вам даже не нужна специальная команда или действие, чтобы скрыть файл.
Файлы и каталоги могут быть скрыты по разным причинам. Например, файлы конфигурации для конкретного пользователя (которые обычно хранятся в домашнем каталоге) скрыты, чтобы они не мешали пользователю выполнять свои повседневные задачи.
Чтобы сделать файл или каталог скрытым, все, что вам нужно сделать, это создать файл или каталог с именем, начинающимся с . . Аналогичным образом вы можете переименовать скрытый файл, удалить точку, и он перестанет быть скрытым.
Команда ls , которую мы видели в предыдущем разделе, по умолчанию не выводит список скрытых файлов и каталогов. Мы можем отобразить скрытые файлы и каталоги, включив параметр -a .
1. [email protected]: ls Documents
2. FILE1.txt File1.txt file1.TXT
3. .
4. [email protected]: ls -a Documents
5. . FILE1.txt File1.txt file1.TXT .hidden .file.txt
6. .
В приведенном выше примере вы видите, что, когда мы перечислили все элементы в нашем текущем каталоге, первые два элемента были . и .. . Если вы не знаете, что это такое, то вам стоит прочитать статью об основах навигации в Linux.
Что нужно запомнить
Команды
file
Позволяет получить информацию о типе файла.
ls -a
Перечисляет содержимое каталога, включая скрытые файлы.
Идеи
В Linux все является файлом.
Даже каталоги.
Linux — это система без расширений.
Файлы могут иметь любое расширение или вообще не иметь.
Linux чувствителен к регистру.
Остерегайтесь глупых опечаток.
Практические задания
-
- Попробуйте запустить команду file с различными входными данными. При этом убедитесь, что вы попробовали как абсолютные, так и относительные пути.
- Теперь выполните команду, которая выведет список содержимого вашего домашнего каталога, включая скрытые файлы и каталоги.
СodeСhick.io — простой и эффективный способ изучения программирования.
2023 © ООО «Алгоритмы и практика»
Типы файлов Linux
В GNU/Linux как и других Unix-подобных операционных системах понятие типа файла не связано с расширением файла (несколькими буквами после точки в конце имени), как это обстоит в Windows.
Unix-подобная ОС не следит за расширениями файлов. Задача связать расширения файла с конкретным пользовательским приложением, в котором этот файл будет открываться, видимо лежит на какой-либо дополнительной программе. В свою очередь пользовательское приложение анализирует структуру данный файла, расширение ему также безразлично.
Таким образом, среди файловых атрибутов, хранящихся в операционной системе на базе ядра Linux, нет информации о типе данных в файле. Там есть информация о более существенном разделении, связанном с тем, что в Unix-подобных системах все объекты – это файлы. Все объекты весьма разнообразны. Поэтому тип файла в Linux – это скорее тип объекта, но не тип данных как в Windows.
В операционной системе GNU/Linux существуют следующие типы файлов: обычные файлы, каталоги, символьные ссылки, блочные устройства, символьные устройства, сокеты, каналы. Каждый тип имеет собственное обозначение одним символом. Знание этих символов нам пригодится в дальнейшем при изучении командной оболочки Bash.
Обычные файлы (-)
Сюда относятся все файлы с данными, играющими роль ценной информации сами по себе. Linux все-равно текстовый перед ним файл, исполняемый или картинка. В любом случае это будет обычный (regular) файл. Все они обозначаются знаком минус «-«. Остальные типы файлов считаются специальными (special).
Каталоги (d)
В Linux каталог представляет собой такой тип файла, данными которого является список имен других файлов и каталогов, вложенных в данный каталог. Напрямую, то есть через какой-либо редактор, пользователь не может редактировать данные файла-каталога. Редактированием занимается ядро операционной системы, получая, в том числе от пользователя, команды создания файла, удаления и др.
В файле каталога осуществляется связь между именами файлов (словесного обозначения для людей) и их индексными дескрипторами (истинным именем-числом, которым оперирует ОС).
В Unix-подобных системах один и тот же файл может существовать под разными именами и/или в разных каталогах: все имена будут связаны с одним и тем же индексным дескриптором (механизм жестких ссылок).
Также следует, что файлы всегда должны содержаться в каталогах, иначе станут недоступны, так как нигде не будет содержаться записи о них.
Символьные ссылки (l)
Символьная ссылка – это файл, в данных которого содержится адрес другого файла по его имени (а не индексному дескриптору).
Выполнение символьной ссылки приводит к открытию файла, на который она указывает. Это аналог ярлыков в операционной системе Windows.
Если удалить исходный файл, то символьная ссылка продолжит существовать. Она по-прежнему будет указывать на файл, которого уже нет.
Символьные ссылки не содержат атрибутов файлов, на которые они указывают. У них есть собственные атрибуты (свое время создания, размер, права доступа).
Символьные (c) и блочные устройства (b)
Файлы устройств предназначены для обращения к аппаратному обеспечению компьютера (дискам, принтерам, терминалам и др.). Когда происходит обращение к файлу устройства, то ядро операционной системы передает запрос драйверу этого устройства.
К символьным устройствам обращение происходит последовательно (символ за символом). Примером символьного устройства может служить терминал.
Считывать и записывать информацию на блочные устройства можно в произвольном порядке, причем блоками определенного размера. Пример: жесткий диск.
Сокеты (s) и каналы (p)
Чтобы понять, что такое канал и сокет, необходимо понимание процессов в операционной системе. И каналы и сокеты организуют их взаимодействие. Пользователь с данными типами файлов почти не сталкивается.
Ключевым отличием канала от сокета является то, что канал однонаправлен. Через канал один процесс всегда передает данные второму, но не наоборот. Сокеты позволяют передавать данные в разных направлениях, т. е. осуществляют связь.
Также следует отметить, что канал представлен в структуре каталогов файлом, только если он именован. Когда возникают безымянные каналы, то они существуют только внутри ядра Linux.
Команда file
Хотя выше было сказано, что Линукс не делает предположение о типе данных в обычном файле, есть специальная утилита, которая выполняет эту задачу, – программа file. Для этого она анализирует начало содержимого файла и находит в нем специальные «сигналы», характерные для определенного типа – бинарного файла, текстового, изображения и др.
На скриншоте также показано, что расширение для программы file безразлично. Файл flag – копия flag.png , и программа успешно его идентифицировала как изображение.
Команда file имеет множество различных ключей.
В примере файл 2020.ods является символьной ссылкой на файл, находящийся в другом каталоге, о чем нам говорит команда file без ключей. С помощью ключа -L мы можем узнать тип файла, на который ссылается файл-ссылка.
Курс с ответами к заданиям и дополнительными уроками в PDF
Введение в Linux и Bash. Курс