Блок 5
Файловая система Linux
Это один из центральных блоков всего курса. Практически всё, что вы будете делать в Linux дальше — устанавливать программы, настраивать сервисы, писать скрипты, управлять правами доступа — так или …
Введение в блок
Это один из центральных блоков всего курса. Практически всё, что вы будете делать в Linux дальше — устанавливать программы, настраивать сервисы, писать скрипты, управлять правами доступа — так или иначе сводится к работе с файлами и папками. В этом блоке мы разберём, как устроена файловая система Linux изнутри, что такое inode, как выглядит стандартная структура каталогов, и освоим весь базовый набор команд для навигации и работы с файлами — тот самый инструментарий, которым системный администратор пользуется буквально каждую минуту работы.
Материал блока объёмный, но он выстроен последовательно: от абстрактного понятия «файловая система» — к конкретным, практическим командам, которые вы будете использовать ежедневно на протяжении всего оставшегося курса.
Урок 5.1. Что такое файловая система и что такое inode
Разобраться на концептуальном уровне, как операционная система хранит и организует файлы на диске — без этого понимания дальнейшие темы (права доступа, ссылки, диски) будут восприниматься как набор изолированных фактов, а не связная картина.
Теория
Мы уже несколько раз упоминали термин «файловая система» в предыдущих блоках (например, в уроке 2.4 про разметку диска), но не разбирали его подробно. Настало время сделать это.
Файловая система — это набор правил и структур данных, по которым операционная система организует хранение файлов на физическом носителе (жёстком диске, SSD, флешке). Представьте очень большую библиотеку без единой системы каталогизации: тысячи книг просто свалены в кучу. Найти нужную книгу было бы практически невозможно. Файловая система — это как раз та самая система каталогизации: она определяет, где физически на диске хранится содержимое каждого файла, как узнать его имя, размер, дату создания, права доступа к нему, и как быстро найти нужный файл среди тысяч других.
Сам по себе жёсткий диск без файловой системы — это просто огромная последовательность ячеек, способных хранить нули и единицы (биты), без какой-либо встроенной структуры. Файловая система — это тот самый организующий слой, который превращает бесструктурный набор битов в понятные пользователю файлы и папки.
Теперь разберём одно из ключевых и, откровенно говоря, одно из самых пугающих на слух понятий Linux — inode (произносится «айнод», сокращение от «index node», «индексный узел»).
Представьте себе большую библиотеку ещё раз, но на этот раз уже правильно организованную. У каждой книги в такой библиотеке есть карточка в общем каталоге (представьте старый бумажный библиотечный каталог с ящичками карточек). На карточке написано: название книги, автор, дата издания, номер полки и место на полке, где физически стоит книга — но самого текста книги на карточке нет, только «метаданные» (данные о данных) и указание, где искать сам физический объект.
Inode — это именно такая «карточка» для каждого файла в файловой системе Linux (более точно — в файловых системах семейства ext, включая уже упомянутую ext4 из урока 2.4; в других файловых системах могут использоваться иные, хотя концептуально похожие механизмы). Каждый файл на диске имеет свой уникальный inode, который хранит:
- размер файла;
- права доступа к файлу (подробно об этом — в Блоке 8);
- владельца файла и группу-владельца (тоже Блок 8);
- временные метки: когда файл был создан, последний раз изменён, последний раз открыт для чтения;
- указатели на то, в каких именно физических блоках диска хранится реальное содержимое файла.
Важнейший, часто удивляющий новичков факт: сам inode не хранит имя файла. Имя файла — это отдельная, самостоятельная запись, которая хранится в структуре папки (каталога) и представляет собой просто «ссылку», указывающую на конкретный inode. Это довольно абстрактная на первый взгляд деталь, но именно она объясняет, почему в Linux возможна ситуация, когда у одного и того же физического файла (то есть одного и того же inode с одним и тем же содержимым) существует сразу несколько разных имён в разных папках одновременно — это называется жёсткой ссылкой (hard link), и мы подробно разберём этот механизм в уроке 5.7.
Каждый inode имеет уникальный числовой идентификатор — номер inode (inode number), уникальный в пределах одной файловой системы (одного раздела диска). Увидеть номер inode конкретного файла можно командой, которую мы разберём чуть позже в этом же блоке.
Практика
Практика этого урока подготовительная — мы уже установили работающую систему в Блоке 2 и знаем, как открыть терминал (Блок 4). Полноценные команды для просмотра файлов появятся уже в следующих уроках, а здесь — первое практическое соприкосновение с понятием inode.
Шаг 1. Откройте терминал.
Шаг 2. Введите команду ls -i (мы подробно изучим команду ls в уроке 5.4, но полезно увидеть номер inode прямо сейчас, в связке с только что изученной теорией) и нажмите Enter.
Что делает команда: выводит список файлов и папок в текущей директории вместе с номером их inode перед именем.
Что вы увидите: список из нескольких чисел (номера inode) и имён файлов/папок рядом с ними — например, 123456 Desktop, 123457 Documents и так далее (конкретные числа inode у вас, разумеется, будут другими).
[Скриншот терминала]
Шаг 3. Запишите в конспект номер inode любого одного файла или папки из вывода — это просто наблюдение для закрепления теории, полноценная работа с этими данными начнётся в следующих уроках.
Разбор команд
Мы уже частично увидели опцию -i команды ls — полный и подробный разбор всей команды ls со всеми её опциями будет дан в уроке 5.4, посвящённом именно ей.
Возможные ошибки
- Ошибка:** путать понятия «файл» и «имя файла», считая их полностью тождественными.
Почему возникает: в повседневном использовании компьютера (в том числе и в графическом интерфейсе, Блок 3) эта разница действительно незаметна и несущественна.
Как определить: сложность в понимании концепции жёстких ссылок в уроке 5.7, где один и тот же файл может иметь несколько имён.
Как исправить: запомнить чёткое разделение: «файл» — это реальные данные на диске плюс связанный с ними inode с метаданными; «имя файла» — это просто ссылка на этот inode, хранящаяся в папке, и таких ссылок теоретически может быть несколько.
Как избежать: мысленно возвращаться к аналогии библиотечной карточки (inode с метаданными) и самой книги на полке (физическое содержимое), а также к возможности нескольких карточек, указывающих на одну и ту же книгу.
Практические задания
- Введите команду
ls -iв своей домашней папке и запишите в конспект количество файлов/папок, которые вы там увидели, вместе с их номерами inode. - Своими словами (не подглядывая в теорию) объясните в конспекте, чем принципиально отличается inode от обычного имени файла.
Проверка знаний
Вопрос 1. Хранит ли inode внутри себя имя файла?
Ответ: Нет. Имя файла хранится отдельно, в структуре папки, как ссылка, указывающая на конкретный inode. Сам inode хранит только метаданные о файле (размер, права доступа, владельца, временные метки) и указатели на физические блоки данных на диске.
Вопрос 2. Что произойдёт, если бы у одного файла (одного inode) было два разных имени в разных папках, и вы бы изменили содержимое файла через одно из этих имён?
Ответ: Изменения были бы видны и при обращении ко второму имени тоже, потому что оба имени указывают на один и тот же inode с одним и тем же физическим содержимым — это фактически один и тот же файл, доступный под разными именами. Подробно этот механизм (жёсткие ссылки) разберём в уроке 5.7.
Итоги урока
Вы изучили: понятие файловой системы и концепцию inode как «карточки» метаданных файла, отделённой от его имени.
Вы умеете: просматривать номера inode файлов командой ls -i.
В следующем уроке потребуется: это понимание, чтобы разобраться в стандартной структуре каталогов Linux — том самом «библиотечном каталоге» верхнего уровня всей системы.
Урок 5.2. Структура каталогов Linux (FHS)
Освоить стандартную структуру системных папок Linux — без этого знания невозможно осознанно администрировать систему: устанавливать программы, настраивать конфигурации, искать журналы работы системы, ведь всё это раскладывается по строго определённым, стандартизированным местам.
Теория
В отличие от Windows, где системные и пользовательские файлы могут быть разбросаны по разным дискам с разными буквами (C:, D:), в Linux, как мы уже упоминали в уроке 2.4 и уроке 3.2, существует единое дерево файловой системы, начинающееся с одного корня, обозначаемого символом / (одна косая черта, называется root — не путать с пользователем root, о котором подробно поговорим в Блоке 8; в данном контексте слово «root» означает именно «корень» файловой структуры, а не имя пользователя, хотя оба понятия связаны общим английским словом).
Расположение и назначение основных системных папок в Linux не случайно и не зависит от прихоти конкретного дистрибутива — оно определяется стандартом, который называется FHS (Filesystem Hierarchy Standard, «стандарт иерархии файловой системы»). Благодаря этому стандарту опытный администратор, впервые оказавшись за терминалом практически любого дистрибутива Linux (Ubuntu, Debian, Fedora, CentOS и других), уже примерно знает, где искать нужные файлы, потому что базовая структура каталогов везде схожа.
Разберём ключевые папки первого уровня, находящиеся прямо в корне /:
/bin (binaries, «двоичные файлы») — здесь хранятся основные, критически важные для работы системы исполняемые программы (команды), которые могут понадобиться даже при минимальной, аварийной загрузке системы: например, сами команды ls, cp, mv, которые мы изучим далее в этом блоке. В современных версиях Ubuntu (и многих других дистрибутивов) папка /bin технически превращена в символическую ссылку (мы разберём это понятие подробно в уроке 5.7) на папку /usr/bin — то есть исторически разделённые папки сегодня фактически объединены, но путь /bin по-прежнему работает по историческим причинам и для совместимости со старыми скриптами.
/sbin (system binaries, «системные двоичные файлы») — похоже на /bin, но содержит команды, предназначенные в первую очередь для администрирования системы и обычно требующие повышенных прав (о правах — подробно в Блоке 8). Тоже часто является символической ссылкой на /usr/sbin в современных дистрибутивах.
/etc (историческое сокращение, изначально означавшее «et cetera», «и так далее», хотя сегодня чаще расшифровывается в шутку как «Editable Text Configuration») — здесь хранятся практически все системные конфигурационные файлы: настройки сети, списки пользователей, настройки различных служб. Это одна из самых часто посещаемых системным администратором папок — почти любая настройка сервиса или системы в конечном счёте сводится к редактированию файла где-то внутри /etc. Мы будем регулярно возвращаться в эту папку на протяжении всего оставшегося курса.
/home — уже знакомая нам по Блоку 3 родительская папка, содержащая домашние папки всех обычных пользователей системы (например, /home/student).
/root — обратите внимание, это не то же самое, что корень файловой системы /! Это отдельная, специальная домашняя папка именно для суперпользователя root (подробно о нём — в Блоке 8), физически расположенная не внутри /home, а прямо в корне, из соображений исторической традиции и надёжности (чтобы у root была рабочая домашняя папка, даже если раздел /home смонтирован отдельно и по какой-то причине недоступен).
/var (variable, «переменные данные») — здесь хранятся данные, которые регулярно изменяются в процессе работы системы: системные журналы (логи, подробно — в Блоке 10 и Блоке 18, хранятся в подпапке /var/log), очереди печати, кэши некоторых программ, файлы почтовых ящиков локальной почты.
/tmp (temporary, «временные файлы») — папка для временных файлов, которые программы создают во время работы и которые не обязательно должны сохраняться надолго. Важная особенность: в большинстве дистрибутивов, включая Ubuntu, содержимое /tmp автоматически очищается при перезагрузке системы (либо по расписанию), поэтому никогда не стоит хранить там что-то важное на долгий срок.
/usr (Unix System Resources — важно: это не сокращение от «user», хотя многие новички так ошибочно предполагают!) — большая папка, содержащая основную часть установленных программ, их библиотек (общих файлов кода, которые используются сразу несколькими программами), документации и данных, не относящихся к самому ядру системы. Внутри неё есть свои подпапки: /usr/bin (основные пользовательские программы, куда, как мы уже упомянули, сегодня фактически указывает /bin), /usr/lib (библиотеки), /usr/share (данные, не зависящие от конкретной архитектуры процессора — документация, иконки, локализации) и другие.
/dev (devices, «устройства») — здесь физические (и виртуальные) устройства компьютера представлены в виде специальных файлов, в полном соответствии с философским принципом UNIX «всё есть файл», который мы упоминали ещё в уроке 1.1. Например, ваш жёсткий диск может быть представлен файлом вида /dev/sda, а конкретный раздел на нём — /dev/sda1. Подробно поработаем с этой папкой в Блоке 11.
/proc (processes, «процессы») — специальная виртуальная папка (её содержимого физически не существует на диске — оно генерируется ядром «на лету» в реальном времени), через которую можно получить подробную информацию о работающих процессах системы (подробно — в Блоке 10) и параметрах самого ядра.
/mnt и /media — папки, предназначенные для точек монтирования (вспомните понятие из урока 2.4) дополнительных дисков и съёмных носителей (внешних флешек, подключаемых DVD-дисков и подобного).
/opt (optional, «опциональное») — папка для установки дополнительного, не входящего в стандартные репозитории программного обеспечения, часто коммерческих или сторонних программ, которые предпочитают хранить все свои файлы в одном отдельном месте, а не «размазывать» их по стандартным системным папкам.
Полный список папок FHS шире, но перечисленных выше вполне достаточно для уверенной ориентации в системе на старте — к менее часто используемым папкам мы будем обращаться по мере необходимости в последующих блоках курса.
Практика
Шаг 1. Откройте терминал и введите команду ls / (мы уже частично видели похожую команду в уроке 5.1, но здесь применяем её к корню файловой системы — символ / в качестве аргумента).
Что вы увидите: список папок первого уровня прямо в корне вашей системы — большинство из них должно совпадать с только что изученным списком.
[Скриншот терминала]
Шаг 2. Введите команду ls -l /bin (опцию -l подробно разберём в уроке 5.4) и обратите внимание на самую первую строку вывода, если она есть, либо просто пролистайте начало списка файлов.
Что вы увидите: длинный список файлов, названия многих из которых, вероятно, покажутся вам смутно знакомыми, если вы уже пользовались похожими командами (например, вы можете увидеть bash, ls, cp в этом списке — это буквально сами команды, которые мы изучаем).
Шаг 3. Введите команду ls -l / и обратите внимание на строки, начинающиеся с буквы l в самой первой позиции (первый символ каждой строки) — это признак символической ссылки, о которых мы упомянули в теории применительно к /bin и /sbin. Подробно синтаксис этого вывода разберём в Блоке 8, а сам механизм ссылок — в уроке 5.7 этого блока.
Что вы увидите: возможно, среди прочих строк — что-то вроде bin -> usr/bin, наглядно подтверждающее, что /bin действительно является ссылкой на /usr/bin.
Разбор команд
Команда ls, использованная в этом уроке, будет подробно разобрана со всеми параметрами в уроке 5.4 этого же блока — здесь мы используем её лишь как инструмент для иллюстрации структуры каталогов.
Возможные ошибки
- Ошибка:** путать
/root(домашняя папка суперпользователя) с/(корень всей файловой системы).
Почему возникает: похожие названия и написание, оба слова содержат «root».
Как определить: при попытке перейти в /root под обычным пользователем (мы изучим переход между папками в уроке 5.4) система, скорее всего, откажет в доступе — это отдельная защищённая папка, а не общий корень системы, доступ к которому есть у всех.
Как исправить: запомнить чёткое разделение: / — корень всего дерева файловой системы, доступный для просмотра (хотя не обязательно для изменения) любому пользователю; /root — личная, защищённая домашняя папка конкретно суперпользователя, аналогичная по смыслу папкам вида /home/username, но для root.
Как избежать: всегда мысленно проговаривать разницу между «слэш» (корень, /) и «слэш рут» (домашняя папка root, /root) при чтении или произнесении путей вслух.
Практические задания
- Выполните команду
ls /и сопоставьте увиденный список папок с теорией этого урока — для каждой найденной папки запишите в конспект её краткое назначение своими словами. - Найдите среди вывода
ls -l /хотя бы одну символическую ссылку (строку, начинающуюся сl) и запишите в конспект, на что именно она указывает.
Проверка знаний
Вопрос 1. В какой папке хранится подавляющее большинство системных конфигурационных файлов Linux?
Ответ: В папке /etc.
Вопрос 2. Почему не стоит хранить важные файлы длительное время в папке /tmp?
Ответ: Потому что содержимое /tmp в большинстве дистрибутивов, включая Ubuntu, автоматически очищается при перезагрузке системы или по расписанию — эта папка предназначена исключительно для временных, не критичных данных.
Итоги урока
Вы изучили: стандарт FHS и назначение основных системных папок Linux — /bin, /sbin, /etc, /home, /root, /var, /tmp, /usr, /dev, /proc, /mnt, /media, /opt.
Вы умеете: ориентироваться в списке папок корня файловой системы и понимать назначение каждой из них.
В следующем уроке потребуется: это понимание структуры, чтобы разобраться в путях — способах точно указать местоположение конкретного файла или папки внутри всей этой структуры.
Урок 5.3. Абсолютные и относительные пути
Научиться точно указывать местоположение файлов и папок — без уверенного владения путями невозможна никакая дальнейшая работа с файловой системой, ведь почти каждая команда, работающая с файлами, требует указания пути к ним.
Теория
Путь (path) — это текстовое описание местоположения файла или папки внутри дерева файловой системы, представляющее собой последовательность имён папок, разделённых символом / (слэш).
Существует два принципиально разных типа путей.
Абсолютный путь (absolute path) — это полный путь, начинающийся от самого корня файловой системы, то есть от символа /. Абсолютный путь однозначно указывает на местоположение файла независимо от того, в какой папке вы находитесь в данный момент. Пример: /home/student/Documents/notes.txt — это абсолютный путь, который всегда указывает на один и тот же конкретный файл, откуда бы вы его ни ввели.
Относительный путь (relative path) — это путь, который описывается относительно текущей рабочей папки (той самой, которую показывает команда pwd, изученная в уроке 4.3). Относительный путь не начинается с символа /. Например, если вы сейчас находитесь в папке /home/student, то относительный путь Documents/notes.txt будет указывать на тот же файл, что и полный абсолютный путь /home/student/Documents/notes.txt — но только пока вы находитесь именно в этой исходной папке; если вы перейдёте в другую папку, тот же самый относительный путь Documents/notes.txt уже будет указывать на совершенно другое место (или вообще ни на что, если такой подпапки там не существует).
Для построения относительных путей существуют два специальных обозначения:
. (одна точка) — обозначает текущую папку, ту, в которой вы сейчас находитесь. Используется, например, когда нужно явно указать, что действие следует выполнить именно в текущей папке (мы увидим практическое применение этого обозначения в Блоке 6 и Блоке 15).
.. (две точки подряд) — обозначает родительскую папку, то есть папку на один уровень выше текущей в иерархии. Например, если вы находитесь в /home/student/Documents, то путь .. будет указывать на /home/student, а путь ../.. — уже на /home (поднимаемся на два уровня выше).
Можно комбинировать .. с обычными именами папок, чтобы «подняться» на уровень вверх, а затем «спуститься» в другую ветку дерева. Например, находясь в /home/student/Documents, путь ../Downloads будет указывать на /home/student/Downloads — мы сначала поднялись на уровень вверх (в /home/student), а затем спустились в соседнюю папку Downloads.
И, как мы уже знаем из урока 4.3, символ ~ — это ещё одно специальное сокращение, но не для относительного, а фактически для абсолютного пути к домашней папке текущего пользователя (то есть ~ всегда «разворачивается» Bash в полный путь вида /home/username, вне зависимости от того, где вы сейчас находитесь) — поэтому ~ можно свободно использовать из любой папки, и это одно из его практических удобств по сравнению с относительными путями.
Практика
Шаг 1. Откройте терминал и введите pwd, чтобы убедиться, что вы находитесь в своей домашней папке (если нет — не переживайте, команду перехода между папками мы разберём в следующем уроке, а пока просто зафиксируем текущее положение).
Шаг 2. Введите команду echo ~ и нажмите Enter.
Что вы увидите: полный абсолютный путь к вашей домашней папке, например /home/student — это наглядная демонстрация того, что символ ~ действительно «разворачивается» в конкретный абсолютный путь.
Шаг 3. Введите команду echo ~/Documents.
Что вы увидите: путь вида /home/student/Documents — символ ~ можно комбинировать с дополнительными частями пути, как обычную папку.
[Скриншот терминала]
Шаг 4. Введите команду echo /home/student/Documents/../Downloads (подставив вместо student своё реальное имя пользователя, если оно отличается).
Что вы увидите: обратите внимание, echo в этом случае просто выведет введённый текст буквально, не «вычисляя» .. самостоятельно — раскрытие таких путей происходит уже внутри конкретных команд навигации и работы с файлами, которые мы изучим далее. Это хорошая демонстрация того, что echo — простая команда вывода текста, а не интерпретатор путей.
Разбор команд
В этом уроке мы не вводили принципиально новых команд — использовали уже знакомые pwd и echo для иллюстрации теории о путях. Команды, которые реально «понимают» и обрабатывают относительные пути (cd, ls, cp и другие), будут разобраны в следующих уроках этого блока.
Возможные ошибки
- Ошибка:** использование относительного пути без понимания, из какой именно папки он будет «отсчитываться», что приводит к обращению не к тому файлу, который имелся в виду.
Почему возникает: новичок забывает проверить свою текущую рабочую папку (pwd) перед использованием относительного пути.
Как определить: команда сообщает об ошибке «файл или папка не найдены», хотя вы точно знаете, что нужный файл существует где-то в системе.
Как исправить: выполнить pwd, чтобы точно понять текущее местоположение, и либо скорректировать относительный путь, либо использовать абсолютный путь, который не зависит от текущего положения.
Как избежать: в ситуациях, где есть хоть малейшая неуверенность в текущей рабочей папке, предпочитать абсолютные пути — они всегда однозначны и предсказуемы, хотя и требуют больше печати.
- Ошибка:** путаница между
.(одна точка, текущая папка) и..(две точки, родительская папка) — довольно частая опечатка на начальном этапе.
Почему возникает: визуальное сходство обозначений и непривычность такого синтаксиса для новичков, не знакомых с подобной системой из других контекстов.
Как определить: команда с использованием пути неожиданно применяется не к той папке, которая планировалась (например, действие происходит в текущей папке вместо родительской).
Как исправить: внимательно перепроверять количество точек перед выполнением команды, особенно для потенциально необратимых операций (удаление файлов, которое мы разберём в уроке 5.5).
Как избежать: сознательно проговаривать про себя при вводе: «одна точка — это здесь, я; две точки — это уровень выше, мой родитель» — простая мнемоника, которая быстро закрепляется на практике.
Практические задания
- Определите (не выполняя команду перехода, просто рассуждая на бумаге или в конспекте), на какую папку будет указывать путь
../../Music, если вы находитесь в/home/student/Documents/Projects. - С помощью
echoвыведите три варианта пути к своей папкеDownloads: через абсолютный путь, через путь с использованием~, и объясните в конспекте, чем они отличаются на практике (подсказка: абсолютный путь, начинающийся напрямую с/home/..., будет одинаково работать для любого пользователя, знающего точное имя пользователя, тогда как~автоматически подставляет папку именно текущего пользователя, под которым выполняется команда).
Проверка знаний
Вопрос 1. Чем принципиально отличается абсолютный путь от относительного?
Ответ: Абсолютный путь начинается от корня файловой системы (/) и всегда однозначно указывает на одно и то же место, независимо от текущей рабочей папки. Относительный путь не начинается с / и интерпретируется относительно текущей рабочей папки — тот же самый относительный путь может указывать на разные места в зависимости от того, откуда он был использован.
Вопрос 2. Что обозначают . и .. в путях Linux?
Ответ: . (одна точка) обозначает текущую папку; .. (две точки) обозначает родительскую папку, на один уровень выше текущей.
Итоги урока
Вы изучили: понятия абсолютного и относительного пути, специальные обозначения ., .. и ~.
Вы умеете: строить и интерпретировать различные варианты путей к файлам и папкам.
В следующем уроке потребуется: понимание путей, чтобы наконец начать активно перемещаться по файловой системе с помощью команд cd и подробно изучить возможности команды ls.
Урок 5.4. Навигация: `cd`, `ls`, `pwd` — углублённо, все ключевые опции
Освоить три главные команды навигации по файловой системе — с ними вы будете работать буквально в каждой сессии терминала на протяжении всего дальнейшего курса и своей будущей работы с Linux.
Теория
Мы уже частично познакомились с командой pwd в уроке 4.3 (она показывает текущую рабочую папку) и с ls в уроках 5.1–5.2 (показывает содержимое папки). В этом уроке разберём их подробно, во всех практически значимых деталях, а также введём главную команду перехода между папками — cd.
Команда cd (Change Directory, «сменить папку») меняет текущую рабочую папку сессии терминала на указанную. Именно от результата работы cd зависит, как будут интерпретироваться относительные пути в последующих командах (см. предыдущий урок) и что показывает pwd.
Команда ls (List, «показать список») выводит содержимое указанной папки (а если папка не указана явно — содержимое текущей рабочей папки). Мы уже видели простейшее её использование, но у неё десятки полезных опций, из которых стоит выделить самые важные для повседневной работы.
Ключевая опция ls -l (long format, «длинный формат») — выводит не просто имена файлов, а расширенную информацию о каждом: права доступа (пока просто заметим наличие этой информации, подробно разберём в Блоке 8), количество жёстких ссылок (вспомните урок 5.1 про несколько имён у одного inode — подробно раскроем в уроке 5.7), владельца и группу, размер в байтах, дату последнего изменения и, наконец, имя файла.
Опция ls -a (all, «все») — показывает скрытые файлы. В Linux файл или папка считается скрытым, если его имя начинается с точки (.) — это простое и универсальное правило, в отличие от отдельного «атрибута скрытости» файла в некоторых других системах. Скрытые файлы обычно содержат личные настройки программ (вспомните ~/.bash_history из урока 4.5 — это как раз пример такого скрытого файла) и не отображаются по умолчанию, чтобы не загромождать обзор папки второстепенной технической информацией, но они никак не защищены от доступа — просто визуально спрятаны по соглашению.
Опция ls -h (human-readable, «удобно для человека») используется совместно с -l и превращает размеры файлов из «сырых» байтов в удобные единицы (килобайты, мегабайты, гигабайты) — например, вместо 4823041 будет показано 4.6M.
Эти опции прекрасно комбинируются: ls -lah — покажет длинный формат, включая скрытые файлы, с удобными для чтения размерами — одна из самых часто используемых комбинаций опций во всей повседневной практике администратора.
Практика
Шаг 1. Убедитесь, что вы находитесь в своей домашней папке — введите cd без каких-либо аргументов и нажмите Enter.
Что делает команда cd без аргументов: возвращает вас именно в домашнюю папку, вне зависимости от того, где вы находились до этого — это удобное короткое действие, эквивалентное полному cd ~.
Шаг 2. Введите ls без опций, чтобы увидеть список файлов и папок в домашней директории в простом, кратком формате.
Шаг 3. Введите ls -l, чтобы увидеть развёрнутую информацию.
Что вы увидите: несколько строк вида:
```
drwxr-xr-x 2 student student 4096 июл 20 10:15 Documents
-rw-r--r-- 1 student student 220 июл 20 10:00 notes.txt
```
Разберём эту строку по частям (детально права доступа разберём в Блоке 8, но полезно уже сейчас увидеть общую структуру): первый символ (d для папки, - для обычного файла) — тип элемента; следующие девять символов — права доступа; число после них — количество жёстких ссылок; далее — владелец и группа-владелец; затем — размер в байтах; затем — дата и время последнего изменения; и в конце — имя файла или папки.
[Скриншот терминала]
Шаг 4. Введите ls -a, чтобы увидеть скрытые файлы.
Что вы увидите: помимо уже знакомых обычных папок появятся дополнительные элементы, начинающиеся с точки — например, .bashrc, .bash_history, .config и другие, а также специальные записи . и .., которые мы разбирали в предыдущем уроке — они тоже присутствуют в каждой папке как своего рода служебные «ссылки сами на себя и на родителя».
Шаг 5. Скомбинируйте все три изученные опции: ls -lah.
Что вы увидите: полную развёрнутую информацию обо всех файлах, включая скрытые, с удобными для чтения размерами — одну из самых информативных команд для быстрой оценки содержимого папки.
Шаг 6. Перейдите в папку Documents (если она у вас есть — если её нет, создайте её сначала через файловый менеджер из Блока 3, либо дождитесь урока 5.6, где мы научимся создавать папки прямо из терминала): введите cd Documents и нажмите Enter.
Что произойдёт: приглашение командной строки изменится, отразив новое текущее местоположение (вспомните урок 4.3 про символ ~ в приглашении — теперь вы увидите что-то вроде ~/Documents$).
Шаг 7. Введите cd .., чтобы вернуться на уровень выше, в домашнюю папку.
Что произойдёт: вы окажетесь обратно в ~, приглашение снова покажет просто ~$.
Шаг 8. Введите cd / (переход по абсолютному пути к самому корню файловой системы), а затем ls, чтобы увидеть содержимое корня — вы уже видели это в уроке 5.2, но теперь делаете это осознанно, применяя команду cd для перехода.
Шаг 9. Вернитесь в домашнюю папку командой cd без аргументов (как в шаге 1) либо командой cd ~.
Разбор команд
Команда cd
- Назначение:** изменяет текущую рабочую папку сессии терминала.
- Синтаксис:**
cd [путь] - Основные параметры:** у
cdнет типичных опций в стиле-lили-a, как у большинства других команд (это одна из так называемых «встроенных» команд самого Bash — builtin, о которых мы упоминали в уроке 4.7), но есть особые аргументы-сокращения: без аргументов — переход в домашнюю папку;cd -(дефис) — переход в предыдущую папку, где вы находились до последнего перехода (удобно для быстрого «переключения» между двумя часто посещаемыми папками). - Реальные примеры использования:**
cd Documents— перейти в подпапку Documents текущей папки (относительный путь).cd /var/log— перейти по абсолютному пути прямо в системную папку журналов (её мы подробно изучим в Блоке 10).cd ..— подняться на уровень выше.cd -— вернуться в предыдущую посещённую папку.- Типичные ошибки:** попытка перейти в несуществующую папку, или в папку, к которой у вас нет прав доступа (подробно о правах — в Блоке 8).
- Способы исправления ошибок:** внимательно прочитать сообщение об ошибке (
No such file or directory— «нет такого файла или папки» означает, что путь указан неверно или папки не существует;Permission denied— «доступ запрещён» означает, что папка существует, но у вас недостаточно прав, чтобы в неё зайти), проверить правильность написания пути черезls, при необходимости использовать автодополнение по Tab (вспомните урок 4.5) — оно надёжно защищает именно от опечаток в именах папок.
Команда ls
- Назначение:** выводит список файлов и папок в указанной (или текущей, если не указана) директории.
- Синтаксис:**
ls [опции] [путь] - Основные параметры:**
-l(развёрнутый формат),-a(показать скрытые файлы),-h(удобочитаемые размеры, используется вместе с-l),-R(рекурсивный вывод — показать содержимое не только указанной папки, но и всех вложенных подпапок). - Дополнительные параметры:**
-t(сортировать по времени изменения, самые свежие файлы — первыми),-S(сортировать по размеру файла, самые большие — первыми),-r(обратный порядок сортировки, комбинируется с другими опциями сортировки). - Реальные примеры использования:**
ls -lah ~— подробный список всех файлов домашней папки, включая скрытые, с удобными размерами.ls -lt /var/log— список файлов журналов, отсортированный от самых недавно изменённых к самым старым — крайне полезно при диагностике проблем (Блок 18), когда нужно быстро найти файл журнала, изменившийся прямо сейчас.- Типичные ошибки:** попытка использовать несуществующую опцию (например, случайно перепутав
-1(цифра один — вывод по одному файлу в строке) с-l(строчная буква «эль») — эти символы легко перепутать зрительно на некоторых шрифтах). - Способы исправления:** при сообщении об ошибке
invalid option(«неверная опция») внимательно перепроверить набранные символы, используяman lsилиls --help(вспомните урок 4.7) для сверки правильных обозначений опций.
Команда pwd
Мы уже разобрали эту команду подробно в уроке 4.3 — здесь лишь напомним её назначение: показывает полный абсолютный путь текущей рабочей папки. Единственное, что стоит добавить: команда pwd особенно полезна именно после выполнения cd с относительным путём или сокращениями вроде cd .. или cd -, чтобы явно убедиться, куда именно вы попали, если есть хоть малейшее сомнение.
Возможные ошибки
- Ошибка:** попытка перейти в файл (а не в папку) командой
cd.
Почему возникает: новичок не всегда чётко различает файлы и папки при беглом просмотре списка ls без опции -l, которая явно показывает тип элемента (d для папки, - для файла) в первом символе строки.
Как определить: сообщение об ошибке вида Not a directory («не является папкой»).
Как исправить: выполнить ls -l, чтобы точно определить, что является папкой (d в начале строки), а что — обычным файлом, прежде чем пытаться перейти в него как в папку.
Как избежать: привыкнуть регулярно использовать ls -l (или хотя бы обращать внимание на визуальное различие — в большинстве настроенных терминалов Ubuntu папки и файлы дополнительно подсвечиваются разными цветами) для однозначного различения файлов и папок.
Практические задания
- Из домашней папки перейдите последовательно на два уровня вглубь любой вложенной структуры (например,
cd Documents, затем в любую подпапку внутри неё, если есть, или создайте её через файловый менеджер заранее), затем одной командойcd ../..вернитесь сразу на два уровня вверх, и проверьте результат командойpwd. - Выполните
ls -laht /var/log(сочетание уже изученных опций плюс сортировка по времени) и опишите в конспекте, что означает первая строка результата — какой файл изменялся последним. - Потренируйтесь с
cd -: перейдите из домашней папки в/etc, затем из/etcв/var, а затем дважды подряд выполнитеcd -и объясните в конспекте, в каких папках вы оказались после каждого из двух выполнений и почему.
Проверка знаний
Вопрос 1. Что произойдёт, если ввести команду cd вообще без каких-либо аргументов?
Ответ: Вы перейдёте в свою домашнюю папку — это короткий эквивалент команды cd ~.
Вопрос 2. Какая опция команды ls показывает файлы, чьи имена начинаются с точки, и как называются такие файлы?
Ответ: Опция -a (all). Такие файлы называются скрытыми — в Linux файл считается скрытым по простому правилу: его имя начинается с точки.
Итоги урока
Вы изучили: команду cd для перехода между папками и подробные возможности команды ls с её ключевыми опциями -l, -a, -h, -R, -t.
Вы умеете: свободно перемещаться по файловой системе, просматривать содержимое папок в разных форматах, включая скрытые файлы.
В следующем уроке потребуется: уверенное владение навигацией, чтобы научиться создавать, копировать, перемещать и удалять сами файлы.
Урок 5.5. Работа с файлами: `touch`, `cat`, `cp`, `mv`, `rm`
Освоить базовые операции над файлами через терминал — создание, просмотр содержимого, копирование, перемещение и удаление. Это прямые текстовые аналоги тех же действий, которые мы уже выполняли мышью в файловом менеджере в уроке 3.2, но теперь — значительно быстрее, точнее и, что особенно важно, пригодные для автоматизации в будущих скриптах (Блок 15).
Теория
Разберём назначение каждой из пяти команд этого урока на концептуальном уровне, прежде чем переходить к детальной практике и разбору команд.
touch — исторически предназначена для обновления «времени последнего изменения» файла без изменения его содержимого (само название происходит от идеи «прикоснуться» к файлу), но на практике чаще всего используется именно для быстрого создания нового пустого файла, если файл с указанным именем ещё не существует.
cat (concatenate, «объединить, сцепить») — простейший способ вывести содержимое текстового файла прямо в терминал. Название отражает более широкую возможность команды — объединять содержимое сразу нескольких файлов в единый вывод, но чаще всего на практике cat используется именно для быстрого просмотра содержимого одного конкретного файла.
cp (copy, «копировать») — создаёт копию файла (или папки, с дополнительным параметром) в указанном месте, оставляя оригинал нетронутым.
mv (move, «переместить») — перемещает файл из одного места в другое. Важная особенность: эта же команда используется и для переименования файлов — в Linux переименование концептуально является просто «перемещением» файла в ту же самую папку, но под другим именем, поэтому отдельной команды «rename» в базовом наборе нет.
rm (remove, «удалить») — удаляет файл. Критически важно понимать одну особенность, кардинально отличающую терминал от графического файлового менеджера: при удалении файла командой rm файл не попадает в корзину, как это происходило в уроке 3.2 при удалении через графический интерфейс. Удаление через rm в базовом варианте является немедленным и безвозвратным. Это одна из первых по-настоящему серьёзных «опасных зон» в этом курсе, и мы уделим ей особое внимание в разделе про ошибки.
Практика
Шаг 1. Перейдите в свою домашнюю папку (cd ~) и создайте новую учебную папку для практики этого урока: пока используем уже знакомый нам подход — для полноценного создания папки командой mkdir дождитесь следующего урока 5.6, либо создайте папку Linux-Course/Block-05 через графический файловый менеджер прямо сейчас, а затем перейдите в неё через терминал: cd ~/Linux-Course/Block-05 (при условии, что такая папка уже существует).
Шаг 2. Создайте пустой файл: touch file1.txt.
Что произойдёт: в текущей папке появится новый пустой файл с указанным именем. Проверьте результат командой ls -l — вы увидите файл с размером 0 байт.
[Скриншот терминала]
Шаг 3. Добавьте в файл немного текста с помощью уже знакомой команды echo и специального символа перенаправления > (подробно перенаправления потоков разберём в Блоке 6, но полезно применить простейший пример уже сейчас): echo "Это моя первая учебная строка текста" > file1.txt.
Что произойдёт: символ > перенаправляет вывод команды echo не на экран, как раньше, а прямо внутрь указанного файла, полностью заменяя его прежнее содержимое (в данном случае — пустоту).
Шаг 4. Просмотрите содержимое файла: cat file1.txt.
Что вы увидите: текст, который вы только что записали в файл, выведенный прямо в терминал.
Шаг 5. Скопируйте файл: cp file1.txt file1_copy.txt.
Что произойдёт: появится новый файл file1_copy.txt с точно таким же содержимым, что и оригинал. Проверьте результат командой ls -l — теперь в папке должно быть два файла с одинаковым размером.
Шаг 6. Переименуйте копию: mv file1_copy.txt file1_backup.txt.
Что произойдёт: файл file1_copy.txt исчезнет из списка, а вместо него появится file1_backup.txt с тем же самым содержимым — это и есть переименование через перемещение «в ту же папку под новым именем».
Шаг 7. Создайте вложенную подпапку для демонстрации перемещения между папками (снова опережая формальное изучение mkdir в следующем уроке — либо создайте её через графический интерфейс, либо, если хотите, забегая вперёд, попробуйте команду mkdir backups, она интуитивно понятна по названию). Переместите туда файл: mv file1_backup.txt backups/.
Что произойдёт: файл file1_backup.txt исчезнет из текущей папки и появится внутри подпапки backups. Проверьте результат командами ls (в текущей папке файла быть не должно) и ls backups (файл должен быть там).
[Скриншот результата]
Шаг 8. Удалите оригинальный файл file1.txt командой rm file1.txt.
Что произойдёт: файл будет немедленно и безвозвратно удалён, без запроса подтверждения и без перемещения в какую-либо корзину. Проверьте результат командой ls — файла больше не должно быть в списке.
Разбор команд
Команда touch
- Назначение:** создаёт новый пустой файл (если он ещё не существует) либо обновляет время последнего изменения уже существующего файла.
- Синтаксис:**
touch [опции] имя_файла - Основные параметры:** обычно используется без опций для базового создания файла; опция
-tпозволяет явно указать конкретную дату и время для установки в качестве времени изменения файла (используется значительно реже, в специфических административных задачах). - Реальные примеры использования:**
touch report.txt— создать новый пустой файл;touch file1.txt file2.txt file3.txt— создать сразу несколько файлов одной командой, перечислив их имена через пробел. - Типичные ошибки:** попытка использовать
touchдля создания папки — команда создаёт исключительно файлы, для папок используется отдельная командаmkdir(урок 5.6). - Способы исправления:** если по ошибке был создан файл с именем, которое планировалось для папки, удалить файл (
rm) и использовать правильную командуmkdir.
Команда cat
- Назначение:** выводит содержимое одного или нескольких текстовых файлов в терминал.
- Синтаксис:**
cat [опции] файл1 [файл2 ...] - Основные параметры:**
-n(пронумеровать строки вывода) — полезно при обсуждении конкретных строк файла, например при написании документации или указании коллеге на конкретное место в конфигурационном файле. - Реальные примеры использования:**
cat file1.txt— вывести содержимое одного файла;cat file1.txt file2.txt— вывести содержимое сразу двух файлов подряд, одно за другим (отсюда и название «concatenate», «сцепить»). - Типичные ошибки:** попытка использовать
catдля просмотра очень больших файлов (например, многомегабайтных журналов) — весь текст выведется в терминал сразу, «пролистав» его весь мимо видимой области экрана без возможности удобной навигации. - Способы исправления:** для больших файлов правильнее использовать команды постраничного просмотра (
less), которые подробно разберём в Блоке 6.
Команда cp
- Назначение:** копирует файл или (с дополнительным параметром) целую папку из одного места в другое.
- Синтаксис:**
cp [опции] источник назначение - Основные параметры:**
-r(recursive, «рекурсивно») — обязательный параметр при копировании папок целиком, а не отдельных файлов, так как по умолчаниюcpбез этого параметра откажется копировать папку;-v(verbose, «подробно») — выводит информацию о каждом скопированном файле, полезно при копировании множества файлов сразу, чтобы видеть прогресс. - Дополнительные параметры:**
-i(interactive, «интерактивно») — запрашивает подтверждение перед перезаписью уже существующего файла с таким же именем в папке назначения, снижая риск случайной потери данных. - Реальные примеры использования:**
cp report.txt report_backup.txt— создать копию файла в той же папке под другим именем.cp report.txt ~/Documents/— скопировать файл в другую папку, сохранив то же самое имя.cp -r Project/ Project_backup/— скопировать целую папку со всем её содержимым.- Типичные ошибки:** попытка скопировать папку без параметра
-r.
Способы исправления: при сообщении об ошибке вида omitting directory («папка пропущена») добавить параметр -r к уже введённой команде.
Команда mv
- Назначение:** перемещает файл или папку в другое место, либо переименовывает его в пределах той же папки.
- Синтаксис:**
mv [опции] источник назначение - Основные параметры:**
-i(аналогичноcp— запрос подтверждения перед перезаписью существующего файла);-v(подробный вывод о перемещении). - Реальные примеры использования:**
mv old_name.txt new_name.txt— переименовать файл (в той же папке).mv report.txt ~/Documents/— переместить файл в другую папку, сохранив то же имя.mv Project/ ~/Documents/Project/— переместить целую папку (в отличие отcp, параметр-rдля перемещения папок не требуется, потому что перемещение — это, по сути, просто изменение записи о местоположении, а не физическое копирование всего содержимого заново).- Типичные ошибки:** случайное указание в качестве назначения уже существующего файла с другим содержимым, из-за чего он будет молча перезаписан без предупреждения (если не использовать параметр
-i).
Способы исправления: при работе с важными данными всегда использовать параметр -i для дополнительной защиты от случайной перезаписи; если перезапись всё же произошла и данные важны — восстановление возможно только из заранее сделанной резервной копии (тема Блока 11), сам файл после перезаписи восстановить стандартными средствами нельзя.
Команда rm
- Назначение:** удаляет указанные файлы (а с дополнительным параметром — и папки) немедленно и безвозвратно, без перемещения в корзину.
- Синтаксис:**
rm [опции] файл1 [файл2 ...] - Основные параметры:**
-r(recursive) — обязателен для удаления папок целиком со всем их содержимым;-i(interactive) — запрашивает подтверждение перед удалением каждого файла, крайне рекомендуется для любых потенциально важных данных;-f(force, «принудительно») — подавляет любые предупреждения и запросы подтверждения, удаляет без вопросов даже защищённые от записи файлы, если у вас есть на это права. - Реальные примеры использования:**
rm old_report.txt— удалить один конкретный файл.rm -i old_report.txt— удалить с обязательным запросом подтверждения.rm -r old_project/— удалить целую папку со всем её содержимым.- Типичные ошибки:** это одна из самых частых и самых опасных ошибок новичков во всём курсе — случайное выполнение команды вроде
rm -rfс неверно указанным или вообще пустым путём, что может привести к массовому безвозвратному удалению файлов, вплоть до критических системных данных при выполнении с правами администратора (подробно о таких правах — в Блоке 8).
Как определить: после выполнения команды пропадают файлы, которые не планировалось удалять, либо система начинает вести себя нестабильно, если были задеты системные файлы.
Способы исправления: восстановление возможно только из заранее сделанной резервной копии (Блок 11) — стандартными средствами Linux безвозвратно удалённые через rm файлы восстановить невозможно (в отличие от удаления через корзину графического файлового менеджера).
Как избежать: это критически важное правило безопасности — всегда, без исключений, перепроверять команду rm, особенно с параметрами -r и -f, перед нажатием Enter; на первых порах обучения рекомендуется всегда использовать параметр -i для дополнительной защиты; никогда не выполнять команды rm, скопированные из непроверенных источников в интернете, без полного понимания, что именно они делают.
Возможные ошибки
Основные типичные ошибки для каждой команды уже подробно разобраны в предыдущем разделе «Разбор команд» — намеренно объединены с описанием каждой конкретной команды для более удобного и логичного восприятия, учитывая, что в этом уроке мы работаем сразу с пятью разными командами.
Практические задания
- Создайте три пустых файла одной командой
touch(например,report1.txt report2.txt report3.txt), затем с помощьюechoи>запишите в каждый из них любой уникальный текст, и просмотрите содержимое всех трёх сразу одной командойcat report1.txt report2.txt report3.txt. - Скопируйте один из файлов в новую папку (при необходимости создайте её заранее через графический интерфейс), переименуйте копию, а затем удалите оригинал, обязательно используя параметр
-iдля подтверждения. - Потренируйтесь ощутить разницу в безопасности: создайте тестовый файл специально для удаления, попробуйте удалить его сначала с параметром
-i(обратите внимание на запрос подтверждения), затем создайте ещё один тестовый файл и удалите его уже без-i(обратите внимание на отсутствие какого-либо запроса) — опишите в конспекте разницу в своих ощущениях и рисках между этими двумя вариантами.
Проверка знаний
Вопрос 1. Куда попадает файл при удалении командой rm без дополнительных специальных настроек системы?
Ответ: Никуда — файл удаляется немедленно и безвозвратно, минуя какую-либо корзину. Это принципиальное отличие от удаления через графический файловый менеджер, где файл сначала попадает в Trash.
Вопрос 2. Какой параметр обязательно нужно добавить к командам cp и rm, чтобы они могли работать с папками целиком, а не только с отдельными файлами?
Ответ: Параметр -r (recursive, рекурсивно). Без него обе команды по умолчанию откажутся работать с папками (для mv, в отличие от cp и rm, этот параметр не требуется).
Итоги урока
Вы изучили: команды touch, cat, cp, mv, rm для базовых операций над файлами, а также критически важное отличие удаления через терминал от удаления через графический интерфейс.
Вы умеете: создавать, просматривать, копировать, перемещать/переименовывать и удалять файлы через командную строку.
В следующем уроке потребуется: эти же принципы, чтобы освоить аналогичные операции уже над папками (каталогами) как таковыми.
Урок 5.6. Работа с каталогами: `mkdir`, `rmdir`, `rm -r`
Завершить освоение базовых файловых операций, добавив умение создавать и удалять сами папки — команды этого урока мы уже частично предвосхитили в предыдущем уроке, теперь разберём их полноценно и подробно.
Теория
mkdir (make directory, «создать папку») — создаёт новую пустую папку по указанному пути.
rmdir (remove directory, «удалить папку») — удаляет папку, но только при одном строгом условии: папка должна быть полностью пустой. Если в папке есть хоть один файл или подпапка, rmdir откажется её удалять и покажет ошибку — это встроенная защита от случайного удаления папок с важным содержимым.
Для удаления папки вместе со всем её содержимым (файлами и вложенными подпапками) используется уже знакомая нам из предыдущего урока команда rm с параметром -r (recursive), о которой мы уже упоминали. Именно поэтому rmdir на практике используется значительно реже, чем rm -r — большинству реальных задач требуется удалить папку именно вместе с её содержимым, а не только пустую оболочку.
Важное новое понятие, которое стоит явно ввести здесь — рекурсия (recursion) в контексте файловых операций. Когда мы говорим, что команда действует «рекурсивно», это означает, что она применяет своё действие не только к указанной папке напрямую, но и последовательно ко всем вложенным в неё папкам, а затем и к папкам, вложенным в них, и так далее — вглубь всего дерева, сколько бы уровней вложенности ни было. Именно поэтому параметр -r обязателен для операций над непустыми папками — команда должна «знать», что нужно спускаться внутрь и обрабатывать всё содержимое, а не только верхний уровень.
Практика
Шаг 1. Перейдите в свою учебную папку ~/Linux-Course/Block-05 (если вы создавали её в предыдущем уроке через графический интерфейс — теперь у вас есть возможность делать это и командой, которую мы сейчас изучим).
Шаг 2. Создайте новую папку: mkdir test_folder.
Что произойдёт: появится новая пустая папка с указанным именем. Проверьте результат командой ls -l — обратите внимание на первый символ строки с этой папкой, он должен быть d (напомним из урока 5.4, это признак папки, а не обычного файла).
[Скриншот терминала]
Шаг 3. Создайте сразу несколько вложенных папок одной командой, используя параметр -p (parents, «родительские»): mkdir -p deep/nested/folder/structure.
Что делает параметр -p: без него команда mkdir отказалась бы создавать deep/nested/folder/structure одним действием, если промежуточные папки deep, deep/nested, deep/nested/folder ещё не существуют — по умолчанию mkdir создаёт только самый последний уровень указанного пути, при условии что все промежуточные папки уже существуют. Параметр -p решает эту проблему, автоматически создавая все недостающие промежуточные папки по пути.
Что произойдёт: будет создана целая цепочка вложенных папок за одну команду. Проверьте результат командой ls -R deep (вспомните параметр -R из урока 5.4 — рекурсивный просмотр содержимого, включая все вложенные уровни).
Шаг 4. Попробуйте удалить пустую папку test_folder командой rmdir test_folder.
Что произойдёт: так как папка пуста, удаление пройдёт без каких-либо проблем. Проверьте результат командой ls.
Шаг 5. Попробуйте удалить непустую папку deep той же командой rmdir deep.
Что произойдёт: команда завершится ошибкой, потому что папка deep содержит вложенные подпапки (напомним, rmdir работает только с пустыми папками).
[Скриншот результата]
Шаг 6. Теперь удалите ту же папку deep вместе со всем её содержимым командой rm -ri deep (используем сразу оба параметра: -r для рекурсивного удаления всего содержимого, и -i для запроса подтверждения на каждом шаге, как мы уже практиковали в предыдущем уроке).
Что произойдёт: команда будет запрашивать подтверждение для удаления каждого файла и папки внутри deep по очереди (введите y и Enter для подтверждения каждого запроса, либо n для отказа). После подтверждения всех запросов вся структура папок будет полностью удалена.
Разбор команд
Команда mkdir
- Назначение:** создаёт новую пустую папку (или несколько вложенных папок одновременно, с параметром
-p). - Синтаксис:**
mkdir [опции] имя_папки - Основные параметры:**
-p(создать все недостающие родительские папки по пути автоматически);-v(подробный вывод о создании каждой папки). - Реальные примеры использования:**
mkdir Projects— создать одну папку в текущей директории.mkdir -p Projects/2026/Backend— создать сразу три вложенных уровня папок одной командой.mkdir folder1 folder2 folder3— создать сразу несколько отдельных папок одного уровня одной командой, перечислив их имена через пробел.- Типичные ошибки:** попытка создать вложенную структуру папок без параметра
-p, когда промежуточные уровни ещё не существуют.
Способы исправления: при сообщении об ошибке вида No such file or directory в контексте создания вложенной папки — добавить параметр -p к уже введённой команде.
Команда rmdir
- Назначение:** удаляет исключительно пустую папку.
- Синтаксис:**
rmdir [опции] имя_папки - Основные параметры:**
-p— аналогичноmkdir -p, но для удаления: если после удаления указанной папки её родительская папка тоже окажется пустой, она также будет удалена, и так далее вверх по цепочке, пока не встретится непустая родительская папка. - Реальные примеры использования:**
rmdir empty_folder— удалить одну заведомо пустую папку. На практикеrmdirиспользуется реже, чемrm -r, именно из-за своего строгого ограничения только пустыми папками, но эта же строгость делаетrmdirзначительно более безопасной командой — ей физически невозможно случайно удалить что-то важное, если папка не пуста. - Типичные ошибки:** попытка использовать
rmdirдля непустой папки.
Способы исправления: при сообщении об ошибке Directory not empty («папка не пуста») — либо сначала вручную очистить папку от содержимого, либо (если действительно требуется удалить папку вместе со всем содержимым) осознанно перейти к использованию rm -r вместо rmdir.
Возможные ошибки
- Ошибка:** самая серьёзная и потенциально катастрофическая ошибка всего блока — случайное выполнение команды
rm -r(особенно в сочетании с-f) с указанием слишком «широкого» пути, например по ошибке набранной какrm -rf /(при наличии соответствующих административных прав, о которых подробно в Блоке 8) вместо, скажем,rm -rf ./(только текущая папка) — лишний или пропущенный пробел, точка или слэш могут кардинально изменить смысл команды.
Почему возникает: невнимательность при наборе, копирование команд из непроверенных источников без понимания их точного смысла, усталость при длительной работе.
Как определить: массовое, неожиданно быстрое исчезновение большого количества файлов и папок; в критических случаях — потеря работоспособности системы целиком.
Как исправить: современные версии rm в Ubuntu по умолчанию включают встроенную защиту от буквального выполнения rm -rf / без дополнительного явного параметра --no-preserve-root, что снижает (но не устраняет полностью) риск полной катастрофы; тем не менее, для любых менее очевидных, но всё равно широких путей эта защита не действует, и восстановление возможно только из заранее сделанной резервной копии.
Как избежать: это один из важнейших уроков безопасности всего курса — вырабатывать твёрдую привычку: перед выполнением любой команды rm -r сначала выполнить ls (или echo) с тем же самым путём, чтобы явно увидеть, что именно будет удалено, прежде чем заменять ls/echo на реальную команду удаления; никогда не спешить с командами удаления; при малейшей неуверенности использовать параметр -i для пошагового подтверждения.
Практические задания
- Создайте одной командой с параметром
-pвложенную структуру из четырёх уровней папок по своему усмотрению (например, повторяющую структуру вашего будущего учебного проекта), а затем просмотрите её командойls -R. - Потренируйте безопасную привычку из раздела «Возможные ошибки»: прежде чем удалять какую-либо из созданных на этом уроке тестовых папок командой
rm -r, сначала выполнитеls -laпо тому же самому пути, чтобы явно увидеть содержимое, и только затем выполните удаление. - Создайте папку, а затем сразу же (пока она ещё пуста) удалите её командой
rmdir, чтобы закрепить понимание, для каких именно случаев подходит эта более безопасная, но ограниченная команда.
Проверка знаний
Вопрос 1. При каком условии команда rmdir успешно удалит указанную папку?
Ответ: Только если папка полностью пуста — не содержит ни одного файла и ни одной вложенной подпапки. Если папка непуста, rmdir завершится с ошибкой.
Вопрос 2. Что означает термин «рекурсивно» применительно к параметру -r команд cp и rm?
Ответ: Это означает, что команда применяет своё действие не только к указанной папке напрямую, но и последовательно ко всем вложенным в неё папкам и файлам, спускаясь на любую глубину вложенности, а не только к верхнему уровню.
Итоги урока
Вы изучили: команды mkdir (с полезным параметром -p) и rmdir, а также углубили понимание параметра -r команды rm применительно именно к работе с папками, и разобрали одну из самых опасных категорий ошибок в Linux.
Вы умеете: создавать вложенные структуры папок одной командой, безопасно удалять как пустые, так и заполненные папки.
В следующем уроке потребуется: уверенное владение операциями над файлами и папками, чтобы разобраться в отдельном, более абстрактном механизме — жёстких и символических ссылках.
Урок 5.7. Жёсткие и символические ссылки: `ln`, `ln -s`
Разобраться в механизме ссылок — теме, которая логически завершает понимание inode из урока 5.1, и которая практически пригодится, например, при настройке программ (мы уже видели пример с /bin, указывающим на /usr/bin, в уроке 5.2) и при организации удобного доступа к часто используемым файлам из разных мест системы.
Теория
Вернёмся к аналогии из урока 5.1: inode — это «карточка» с метаданными и указанием на реальное физическое содержимое файла, а имя файла в папке — это отдельная ссылка на конкретный inode. Из этого следует важный вывод: технически возможно, чтобы несколько разных имён (в одной или разных папках) указывали на один и тот же inode, то есть фактически на один и тот же физический файл с одним и тем же содержимым.
Жёсткая ссылка (hard link) — это именно такая ситуация: создание ещё одного имени, указывающего на тот же самый inode, что и уже существующий файл. С точки зрения файловой системы оба имени совершенно равноправны — нет «оригинала» и «ссылки» в привычном бытовом смысле, есть просто два (или больше) равноценных пути к одному и тому же физическому содержимому. Если изменить содержимое файла через одно имя — изменения будут немедленно видны и через второе имя, потому что оба имени в конечном счёте ведут к одному и тому же месту хранения данных на диске. Если удалить одно из имён (командой rm) — файл физически не исчезнет, пока остаётся хотя бы одно имя (одна ссылка), указывающее на этот inode; вспомните из урока 5.4, что команда ls -l показывает «количество жёстких ссылок» отдельным числом — вот что это число на самом деле означает.
Важное техническое ограничение жёстких ссылок: они могут указывать только на файлы (не на папки, по историческим и техническим причинам, связанным с риском создания зацикленной структуры) и должны находиться в пределах одной и той же файловой системы (одного и того же раздела диска, вспомните урок 2.4) — нельзя создать жёсткую ссылку, указывающую на файл на другом разделе или другом физическом диске.
Символическая ссылка (symbolic link, часто сокращают до symlink, или иногда говорят «мягкая ссылка», soft link) работает принципиально иначе, и мы уже видели пример такой ссылки в уроке 5.2 (/bin -> usr/bin). Символическая ссылка — это отдельный, самостоятельный маленький файл, который не указывает напрямую на inode целевого файла, а просто содержит текстовый путь к другому файлу или папке. Это очень похоже на «ярлык» в Windows, если вы знакомы с этим понятием — символическая ссылка это буквально указатель-путь, а не прямая связь на уровне inode.
Из этого различия следует несколько практических отличий:
- символические ссылки могут указывать на папки (в отличие от жёстких ссылок), что делает их гораздо более гибким и часто используемым инструментом;
- символические ссылки могут указывать на файлы и папки на других файловых системах (других разделах, других дисках), потому что технически это просто текстовый путь, а не прямая связь с конкретным inode;
- если удалить оригинальный файл, на который указывает символическая ссылка, сама ссылка не исчезнет, но станет «битой» (broken link) — она будет по-прежнему существовать как файл-указатель, но указывать в никуда, и попытка обратиться через неё к содержимому приведёт к ошибке.
На практике в администрировании Linux символические ссылки используются значительно чаще жёстких — именно из-за своей гибкости (возможность указывать на папки и на файлы на других разделах).
Практика
Шаг 1. Перейдите в свою учебную папку и создайте тестовый файл: touch original.txt, а затем запишите в него текст: echo "Оригинальное содержимое" > original.txt.
Шаг 2. Создайте жёсткую ссылку на этот файл: ln original.txt hardlink.txt.
Что делает команда: создаёт новое имя hardlink.txt, указывающее на тот же самый inode, что и original.txt.
Шаг 3. Проверьте номера inode обоих файлов: ls -i original.txt hardlink.txt (вспомните эту опцию из урока 5.1).
Что вы увидите: оба файла покажут абсолютно одинаковый номер inode — наглядное практическое доказательство, что это буквально один и тот же файл под двумя разными именами.
[Скриншот терминала]
Шаг 4. Измените содержимое через одно из имён: echo "Изменённое содержимое" > hardlink.txt, а затем просмотрите содержимое через другое имя: cat original.txt.
Что вы увидите: содержимое original.txt тоже окажется изменённым, хотя мы напрямую редактировали только hardlink.txt — наглядное подтверждение, что это один и тот же физический файл.
Шаг 5. Теперь создайте символическую ссылку: ln -s original.txt symlink.txt.
Шаг 6. Проверьте результат командой ls -l (вспомните, что первый символ строки показывает тип элемента — для символической ссылки это будет l, как мы видели ещё в уроке 5.2 применительно к /bin).
Что вы увидите: строку вида lrwxrwxrwx 1 student student 12 июл 20 11:00 symlink.txt -> original.txt — обратите внимание на стрелку -> в конце, явно показывающую, на что указывает эта ссылка (в отличие от жёсткой ссылки, где такой явной пометки нет, потому что жёсткая ссылка — полноправное имя, а не отдельный указывающий файл).
Шаг 7. Проверьте номера inode: ls -i original.txt symlink.txt.
Что вы увидите: на этот раз номера inode будут разными — символическая ссылка представляет собой отдельный, самостоятельный файл-указатель со своим собственным inode, отличным от inode целевого файла.
Шаг 8. Удалите оригинальный файл: rm original.txt, а затем попробуйте посмотреть содержимое через символическую ссылку: cat symlink.txt.
Что произойдёт: команда завершится ошибкой вида No such file or directory, потому что символическая ссылка symlink.txt пыталась обратиться по указанному в ней текстовому пути original.txt, а такого файла больше не существует — ссылка стала «битой».
Шаг 9. Проверьте, что произошло при этом с жёсткой ссылкой: cat hardlink.txt.
Что вы увидите: содержимое файла по-прежнему благополучно выводится, несмотря на то что «оригинальное» имя original.txt было удалено — потому что жёсткая ссылка hardlink.txt была равноправным именем, указывающим напрямую на всё тот же самый inode, а не на текстовый путь к другому имени.
Разбор команд
Команда ln
- Назначение:** создаёт жёсткую ссылку (по умолчанию, без опций) или символическую ссылку (с опцией
-s) на указанный файл или папку. - Синтаксис:**
ln [опции] целевой_файл имя_ссылки - Основные параметры:**
-s(создать символическую, а не жёсткую ссылку — на практике эта опция используется значительно чаще, чем поведение по умолчанию);-f(принудительно перезаписать уже существующий файл с именем ссылки, если такой есть). - Реальные примеры использования:**
ln -s /var/log/nginx/access.log ~/nginx_log— создать удобную символическую ссылку в домашней папке на глубоко вложенный системный файл журнала (тема Блока 19, посвящённого веб-серверу Nginx), чтобы не набирать длинный путь каждый раз.ln original.txt hardlink.txt— создать жёсткую ссылку (используется значительно реже символической на практике).- Типичные ошибки:** попытка создать жёсткую ссылку (без
-s) на папку — команда завершится ошибкой, так как жёсткие ссылки на папки запрещены по уже упомянутым в теории причинам.
Способы исправления: при необходимости создать ссылку именно на папку — всегда использовать параметр -s (символическую ссылку).
Возможные ошибки
- Ошибка:** путаница между понятиями «удалить оригинал, на который указывает символическая ссылка» (что «ломает» ссылку) и «удалить оригинал, на который указывает жёсткая ссылка» (что не влияет на данные, доступные через оставшиеся жёсткие ссылки).
Почему возникает: оба механизма называются похожим словом «ссылка», и разница между ними не является интуитивно очевидной на первый взгляд, особенно для новичка, недавно узнавшего про inode.
Как определить: неожиданная ошибка No such file or directory при попытке обратиться к содержимому через символическую ссылку, хотя видимый файл-ссылка формально ещё присутствует в списке (ls покажет его, но cat через неё выдаст ошибку).
Как исправить: пересоздать символическую ссылку, указав актуальный путь к файлу (если файл был перемещён, а не удалён окончательно), либо восстановить исходный файл из резервной копии, если он действительно был удалён безвозвратно.
Как избежать: прежде чем удалять файл, на который могут указывать символические ссылки, проверить, есть ли такие ссылки в системе (это можно сделать командой find, которую подробно изучим в уроке 5.8), чтобы осознанно оценить последствия удаления.
Практические задания
- Повторите весь практический сценарий этого урока (шаги 1–9) самостоятельно, без подглядывания в инструкцию, и запишите в конспект своими словами, в какой именно момент и почему
symlink.txtперестал работать, аhardlink.txtпродолжил работать. - Создайте символическую ссылку на целую папку (например, на свою папку
~/Linux-Course), разместив ссылку прямо в домашней папке под коротким именем, например~/course— проверьте, что переход в неё командойcd ~/courseдействительно приводит вас в исходную папку~/Linux-Course.
Проверка знаний
Вопрос 1. Что произойдёт с содержимым, доступным через жёсткую ссылку, если удалить исходное «оригинальное» имя файла, но у файла остаётся хотя бы ещё одна жёсткая ссылка?
Ответ: Содержимое останется полностью доступным через оставшуюся жёсткую ссылку — с точки зрения файловой системы все жёсткие ссылки на один и тот же inode равноправны, «оригинала» в привычном смысле не существует, и физическое содержимое сохраняется, пока остаётся хотя бы одно указывающее на него имя.
Вопрос 2. Может ли символическая ссылка указывать на папку, и может ли это делать жёсткая ссылка?
Ответ: Символическая ссылка может указывать на папку — это одно из её ключевых практических преимуществ. Жёсткая ссылка на папку создать не может — это техническое ограничение, связанное с рисками структурных проблем файловой системы.
Итоги урока
Вы изучили: механизмы жёстких и символических ссылок, их принципиальные различия и практическое применение команды ln.
Вы умеете: создавать оба типа ссылок, различать их в выводе ls -l и ls -i, понимать последствия удаления файлов, на которые указывают ссылки разных типов.
В следующем уроке потребуется: понимание файловой структуры и путей, чтобы освоить инструменты поиска файлов в системе.
Урок 5.8. Поиск файлов: `find`, `locate`, `which`, `whereis`
Освоить инструменты поиска нужных файлов в системе — по мере накопления файлов и знакомства с большой, сложной структурой системных папок (урок 5.2) умение быстро находить нужный файл становится одним из ключевых повседневных навыков администратора.
Теория
Разберём четыре разных инструмента поиска, каждый из которых решает свою конкретную задачу.
find — самый мощный и гибкий, но при этом самый «тяжёлый» по вычислительным затратам инструмент из четырёх. Команда find в реальном времени обходит («сканирует») указанную папку и все вложенные в неё подпапки, проверяя каждый встреченный файл на соответствие заданным вами критериям (имя файла, размер, дата изменения, тип элемента — файл или папка, и множество других). Так как поиск происходит «вживую» по реальному состоянию диска на момент запроса, результат всегда абсолютно точен и актуален, но сам процесс поиска может занимать заметное время при работе с большими объёмами файлов.
locate — работает принципиально иначе и значительно быстрее: эта команда не сканирует диск в реальном времени, а обращается к заранее построенной специальной базе данных, содержащей список всех файлов в системе, — эта база данных периодически (обычно раз в сутки, по расписанию через механизм cron, который подробно разберём в Блоке 10) автоматически обновляется отдельной фоновой службой. Из-за этого поиск через locate практически мгновенный, но с важной оговоркой: результат может быть неактуальным, если файл был создан или удалён совсем недавно, уже после последнего обновления базы данных. Команда locate не всегда установлена в Ubuntu по умолчанию — её может потребоваться установить отдельно (тема пакетных менеджеров, Блок 9).
which — узкоспециализированный инструмент, который ищет не произвольные файлы, а конкретно расположение исполняемой программы (команды) среди папок, перечисленных в специальной системной переменной $PATH (мы подробно разберём эту переменную в Блоке 6, посвящённом Bash углублённо; пока достаточно знать, что $PATH — это список папок, где система ищет исполняемые команды, когда вы вводите их имя в терминале). Команда which отвечает на вопрос: «Если я введу вот эту команду, какая именно программа (какой конкретно файл) будет фактически запущена?»
whereis — похожа на which, но ищет не только сам исполняемый файл команды, но и связанные с ней man-страницы (вспомните урок 4.7) и файлы с исходным кодом, если они установлены в системе — даёт более полную картину «где вообще расположены все компоненты, связанные с этой командой».
Практика
Шаг 1. Используем find для поиска всех файлов с расширением .txt в вашей домашней папке: find ~ -name "*.txt".
Что делает эта команда: ищет, начиная от домашней папки (~) и просматривая все вложенные подпапки, любые файлы, чьё имя соответствует шаблону .txt (звёздочка здесь — специальный символ-шаблон, обозначающий «любое количество любых символов», подробно шаблоны разберём в Блоке 6 применительно к регулярным выражениям).
Что вы увидите: список полных путей ко всем найденным .txt-файлам, включая, например, тестовые файлы, созданные вами в предыдущих уроках этого блока.
[Скриншот терминала]
Шаг 2. Найдём файлы, изменённые за последний день: find ~ -mtime -1.
Что делает эта команда: параметр -mtime -1 означает «время модификации менее одного дня назад», то есть покажет файлы, изменённые совсем недавно — удобно, например, для быстрого нахождения файлов, над которыми вы работали сегодня.
Шаг 3. Попробуем команду locate (если она не установлена, система сообщит об этом — в таком случае просто ознакомьтесь с теорией её работы, а полноценно установить её вы сможете самостоятельно после изучения Блока 9): locate bash.bashrc.
Что вы увидите (если команда установлена): список путей, где найден файл с соответствующим или похожим именем — практически мгновенно, в отличие от потенциально более долгого поиска через find.
Шаг 4. Используем which, чтобы найти, где физически расположена программа, стоящая за уже хорошо знакомой нам командой ls: which ls.
Что вы увидите: путь вида /usr/bin/ls (или /bin/ls, что, как мы помним из урока 5.2, фактически ведёт туда же благодаря символической ссылке) — подтверждение того самого принципа из урока 4.4, что каждая команда — это на самом деле отдельная программа, физически хранящаяся где-то на диске.
[Скриншот результата]
Шаг 5. Используем whereis, чтобы получить более полную картину: whereis ls.
Что вы увидите: не только путь к самому исполняемому файлу, но и путь к его man-странице (вспомните man ls из урока 4.7) — например, что-то вроде ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz.
Разбор команд
Команда find
- Назначение:** ищет файлы и папки, соответствующие заданным критериям, путём реального сканирования файловой системы.
- Синтаксис:**
find [путь_для_поиска] [критерии] [действия] - Основные параметры:*
-name "шаблон"(поиск по имени файла, с поддержкой шаблонов вроде);-type f(искать только обычные файлы) или-type d(искать только папки);-mtime N(файлы, изменённые N дней назад — можно указывать-Nдля «менее N дней назад» или+Nдля «более N дней назад»);-size(поиск по размеру файла, например-size +100Mдля файлов больше 100 мегабайт). - Дополнительные параметры:**
-exec команда {} \;— выполнить указанную команду над каждым найденным файлом (продвинутая возможность, которую подробно применим на практике уже в Блоке 6 и Блоке 15, при автоматизации). - Реальные примеры использования:**
find /var/log -name "*.log" -mtime -7— найти все файлы журналов, изменённые за последнюю неделю (пригодится в Блоке 10 и 18).find ~ -type d -name "backup*"— найти все папки, чьё имя начинается с «backup», внутри домашней папки.find / -size +1G 2>/dev/null— найти по всей системе файлы больше 1 гигабайта (символ перенаправления2>/dev/nullв конце подавляет вывод ошибок доступа к папкам, куда у вас нет прав — подробно перенаправления разберём в Блоке 6).- Типичные ошибки:** запуск поиска от самого корня
/без уточнения области поиска на медленной системе или большом диске — команда может выполняться очень долго, просматривая абсолютно все файлы системы, включая множество папок, куда обычному пользователю доступ и не нужен.
Способы исправления: прервать выполнение сочетанием Ctrl+C (вспомните урок 4.5) и переформулировать поиск, максимально сузив начальную папку поиска до той области, где действительно предполагается искомый файл.
Команда locate
- Назначение:** быстрый поиск файлов по имени с использованием заранее построенной базы данных.
- Синтаксис:**
locate [опции] шаблон_имени - Основные параметры:**
-i(игнорировать регистр букв при поиске — полезно, если не уверены, с большой или маленькой буквы называется искомый файл). - Реальные примеры использования:**
locate nginx.conf— быстро найти расположение конфигурационного файла Nginx (тема Блока 19) без долгого сканирования всего диска. - Типичные ошибки:** ожидание найти через
locateфайл, который был создан буквально только что, до очередного обновления базы данных.
Способы исправления: для гарантированно актуального результата по недавно созданным файлам использовать find вместо locate, либо вручную запустить обновление базы данных командой sudo updatedb (команду sudo подробно разберём в Блоке 8).
Команда which
- Назначение:** показывает полный путь к исполняемому файлу команды, которая будет запущена при вводе её имени.
- Синтаксис:**
which [опции] имя_команды - Реальные примеры использования:**
which python3— узнать, какая именно версия/расположение программы Python будет использована при запуске командыpython3(пригодится, например, в контексте программирования и настройки окружений разработки). - Типичные ошибки:** попытка использовать
whichдля поиска обычных пользовательских файлов (документов, изображений) — команда предназначена исключительно для поиска исполняемых команд в папках из$PATH, а не произвольных файлов.
Способы исправления: для поиска обычных файлов использовать find или locate вместо which.
Возможные ошибки
- Ошибка:** путаница, какой из инструментов поиска использовать в конкретной ситуации.
Почему возникает: новичку не всегда очевидна разница между поиском произвольного файла (find, locate) и поиском расположения именно исполняемой команды (which, whereis).
Как определить: использование which для поиска обычного документа приводит к отсутствию результата, хотя файл точно существует в системе.
Как исправить: переключиться на подходящий инструмент — find для точного и полного поиска произвольных файлов, locate для быстрого поиска по имени, если известно примерное название.
Как избежать: запомнить простое правило: если ищете «где лежит команда, которую я ввожу в терминале» — используйте which/whereis; если ищете «где лежит мой файл или папка» — используйте find/locate.
Практические задания
- Найдите с помощью
findвсе файлы в своей домашней папке размером больше 1 килобайта, изменённые за последние 7 дней (подсказка: скомбинируйте параметры-sizeи-mtimeв одной команде). - Узнайте с помощью
whichполный путь к уже знакомым вам командамcat,cp,mvи запишите результаты в конспект. - Если в вашей системе установлена команда
locate— попробуйте найти с её помощью любой известный вам системный файл (например,bashrc) и сравните скорость выполнения с аналогичным поиском черезfindтех же файлов от корня/(не забудьте подавить ошибки доступа через2>/dev/null, как показано в примере теории).
Проверка знаний
Вопрос 1. Почему поиск через locate работает значительно быстрее, чем через find, но иногда может не найти совсем недавно созданный файл?
Ответ: locate не сканирует диск в реальном времени, а обращается к заранее построенной базе данных, которая обновляется по расписанию (обычно раз в сутки). Если файл создан уже после последнего обновления этой базы, locate о нём ещё «не знает», в то время как find всегда сканирует актуальное реальное состояние диска.
Вопрос 2. Для чего конкретно предназначена команда which, в отличие от find?
Ответ: which ищет не произвольные файлы, а конкретно расположение исполняемой программы (команды), которая будет запущена, если ввести её имя в терминале — она ищет только среди папок, перечисленных в системной переменной $PATH, а не по всей файловой системе.
Итоги урока
Вы изучили: четыре инструмента поиска — find (гибкий, но медленный, работает в реальном времени), locate (быстрый, но может быть неактуален), which и whereis (поиск расположения именно команд).
Вы умеете: находить файлы по имени, размеру, дате изменения, а также определять физическое расположение исполняемых команд.
В следующем уроке потребуется: весь накопленный материал блока, чтобы разобрать оставшуюся тему скрытых файлов и атрибутов чуть подробнее, завершив тем самым базовое освоение файловой системы.
Урок 5.9. Скрытые файлы, атрибуты, `ls -la` и что такое точка и две точки
Закрепить и немного расширить понимание скрытых файлов (уже частично затронутое в уроке 5.4) и специальных записей ./.. (уже частично затронутых в уроке 5.3), сведя все разрозненные наблюдения этого блока в единую целостную картину перед переходом к следующему блоку курса.
Теория
Мы уже неоднократно сталкивались со скрытыми файлами и специальными обозначениями ./.. в разных уроках этого блока — настало время собрать эти знания воедино и слегка их дополнить.
Напомним: скрытый файл или папка в Linux — это любой элемент, чьё имя начинается с точки (.). Это не какое-то специальное защищённое состояние файла, а просто общепринятое соглашение, которого придерживаются файловые менеджеры (и графические, как в уроке 3.2, и команда ls без параметра -a, как в уроке 5.4) — по умолчанию не показывать такие файлы, чтобы не загромождать обзор второстепенной технической информацией. Любой пользователь с соответствующими правами доступа (тема Блока 8) может свободно читать, изменять и удалять скрытые файлы точно так же, как обычные — «скрытость» здесь чисто визуальная условность интерфейса, а не техническое ограничение доступа.
Типичные примеры скрытых файлов и папок, которые вы уже видели в выводе ls -a в уроке 5.4:
.bashrc— файл настроек, который автоматически выполняется при каждом запуске новой интерактивной сессии Bash (мы вернёмся к этому файлу подробно в Блоке 6, когда будем настраивать удобные сокращения команд черезalias);.bash_history— файл истории введённых команд (вспомните урок 4.5);.config— папка, где многие современные программы хранят свои личные настройки конкретного пользователя;.ssh— папка для хранения ключей и настроек SSH-соединений (подробно — в Блоке 13).
Также напомним про специальные записи . и .., которые физически присутствуют в каждой без исключения папке файловой системы Linux (это видно, если выполнить ls -a в абсолютно любой папке — эти две записи будут там всегда, в отличие от обычных скрытых файлов, которые в конкретной папке может и не быть): . — ссылка на саму текущую папку, .. — ссылка на родительскую папку. Технически (и это дополняет наше понимание из урока 5.1 про inode) обе эти записи являются, по сути, разновидностью жёстких ссылок (урок 5.7), автоматически создаваемых файловой системой при создании каждой новой папки: . — это жёсткая ссылка папки саму на себя, а .. — жёсткая ссылка на родительскую папку. Именно поэтому, кстати, если вы внимательно посмотрите на число «количество жёстких ссылок» в выводе ls -l (см. урок 5.4) для любой папки, оно никогда не бывает меньше 2 — минимум одна ссылка от самой записи . внутри неё самой и минимум ещё одна — от записи .. внутри каждой её непосредственной подпапки (если подпапок нет — всё равно есть ссылка ., плюс ссылка на эту папку из родительской папки, что в сумме тоже даёт минимум 2).
Практика
Шаг 1. Перейдите в свою домашнюю папку и выполните ls -la (полная комбинация опций, которую мы уже разбирали в уроке 5.4).
Что вы увидите: полный список, включая скрытые файлы и папки . и .. в самом начале списка.
[Скриншот терминала]
Шаг 2. Обратите внимание на строку, соответствующую записи . (текущая папка) — посмотрите на число «количество жёстких ссылок» (второй столбец после символов прав доступа) для неё.
Что вы увидите: это число будет отражать структуру именно вашей домашней папки — чем больше в ней подпапок, тем больше будет это число, в полном соответствии с только что разобранной теорией (каждая подпапка добавляет одну ссылку .., указывающую обратно на родителя).
Шаг 3. Создайте новый скрытый файл, чтобы на практике убедиться в простоте правила «скрытости»: touch .my_hidden_file.
Шаг 4. Выполните ls без параметров.
Что вы увидите: только что созданный файл не появится в списке — простое подтверждение, что имя, начинающееся с точки, автоматически делает файл скрытым от базового вывода ls.
Шаг 5. Теперь выполните ls -a, чтобы убедиться, что файл на самом деле никуда не пропал, а просто не отображался.
Что вы увидите: .my_hidden_file присутствует в полном списке.
Шаг 6. Просмотрите его содержимое обычной командой cat .my_hidden_file (файл будет пустым, так как мы создавали его через touch, но сама команда должна выполниться без каких-либо ошибок или особых препятствий).
Что это доказывает: скрытые файлы полностью доступны для всех обычных операций (чтение, копирование, перемещение, удаление) точно так же, как и обычные файлы — единственное отличие исключительно в том, показываются ли они по умолчанию в списках.
Шаг 7. Удалите тестовый скрытый файл, чтобы не загромождать домашнюю папку: rm .my_hidden_file.
Разбор команд
В этом уроке мы не вводили принципиально новых команд — мы применили уже хорошо знакомые ls -la, touch, cat, rm для закрепления и практической демонстрации теории про скрытые файлы и записи ./...
Возможные ошибки
- Ошибка:** ошибочное представление, что скрытые файлы каким-то образом защищены от случайного удаления или изменения сильнее, чем обычные файлы, «раз уж они скрыты».
Почему возникает: интуитивная (но неверная) ассоциация слова «скрытый» с повышенной защищённостью или особым статусом.
Как определить: случайное удаление важного скрытого конфигурационного файла (например, .bashrc) командой rm -a .* или похожей неаккуратной командой с широким шаблоном, без специальной защиты.
Как исправить: восстановить файл из резервной копии (Блок 11), либо, для некоторых стандартных системных скрытых файлов, найти их типовое содержимое по умолчанию в официальной документации Ubuntu и воссоздать вручную.
Как избежать: относиться к скрытым файлам с той же осторожностью, что и к обычным (а зачастую даже с большей, так как многие из них — критически важные персональные конфигурационные файлы), не полагаясь на их «скрытость» как на защиту.
Практические задания
- Выполните
ls -laв своей домашней папке и составьте в конспекте список из пяти найденных скрытых файлов/папок с кратким предположением (можно опираться на название) об их назначении. - Создайте новую пустую папку, а затем сразу выполните в ней
ls -la— убедитесь, что даже в абсолютно пустой, только что созданной папке уже присутствуют записи.и.., и объясните в конспекте, почему это так, опираясь на теорию этого урока.
Проверка знаний
Вопрос 1. Является ли «скрытость» файла (имя, начинающееся с точки) техническим ограничением доступа к нему?
Ответ: Нет. Это чисто визуальное соглашение, которого придерживаются файловые менеджеры и команда ls по умолчанию. Любой пользователь с соответствующими правами доступа может свободно читать, изменять и удалять скрытые файлы точно так же, как и обычные.
Вопрос 2. Чем технически являются записи . и .., присутствующие в каждой папке?
Ответ: Это, по сути, автоматически создаваемые файловой системой жёсткие ссылки: . — ссылка папки на саму себя, .. — ссылка на родительскую папку. Именно поэтому они учитываются в счётчике «количество жёстких ссылок», который показывает команда ls -l.
Итоги урока
Вы изучили: правило определения скрытых файлов в Linux и техническую природу специальных записей . и .. как автоматических жёстких ссылок.
Вы умеете: создавать, находить и работать со скрытыми файлами наравне с обычными.
В следующем уроке (это будет уже Блок 6) потребуется: весь материал этого блока — навигация, работа с файлами и папками, ссылки, поиск — чтобы перейти к более продвинутой работе с Bash: конвейерам, перенаправлениям потоков и обработке текста.
Мини-проект блока
Задача: используя исключительно терминал (без обращения к графическому файловому менеджеру), создать организованную файловую структуру для условного личного проекта — как если бы вы готовили рабочее пространство для реальной задачи.
Что нужно сделать:
- Создайте одной командой с параметром
-pследующую структуру папок внутри своей домашней папки:MyProject/src,MyProject/docs,MyProject/backups,MyProject/logs. - Создайте в
MyProject/srcтри текстовых файла с любым содержимым черезtouchиecho. - Скопируйте все три файла в
MyProject/backups, добавив к каждому имени суффикс_backup. - Создайте в
MyProject/docsфайлREADME.txtс кратким описанием (2–3 предложения) вашего условного проекта. - Создайте символическую ссылку на файл
README.txtпрямо в своей домашней папке под именем~/project_readmeи убедитесь, что через неё можно прочитать содержимое исходного файла. - С помощью
findнайдите и выведите список всех файлов внутриMyProject, изменённых за последний день. - Составьте в конспекте отчёт: полное дерево получившейся структуры (можно получить его командой
ls -R MyProjectилиfind MyProject) и краткое описание, что и зачем вы делали на каждом шаге.
Критерий готовности: вся структура создана исключительно командами терминала, символическая ссылка работает корректно, отчёт написан.
Контрольные вопросы
- Объясните своими словами, что такое inode, и чем он отличается от имени файла.
- Перечислите пять папок из корня файловой системы Linux и кратко опишите назначение каждой.
- Приведите пример абсолютного и относительного пути к одному и тому же файлу, объяснив разницу.
- Разберите команду
cp -riv Project/ Project_backup/на составные части и объясните назначение каждого параметра. - Объясните разницу между жёсткой и символической ссылкой, приведя по одному практическому примеру использования каждой.
- Чем отличается
findотlocateпо принципу работы и скорости? - Почему
rm, в отличие от удаления через графический файловый менеджер, требует особой осторожности?
Выводы по блоку
Это был один из самых объёмных и насыщенных блоков курса — но и один из самых фундаментальных. Вы прошли путь от абстрактного понятия файловой системы и inode до уверенного практического владения полным набором команд для навигации, работы с файлами, папками и ссылками, а также инструментами поиска. Эти команды — не изолированный набор фактов для запоминания, а рабочий инструментарий, которым вы будете пользоваться в буквально каждом из оставшихся блоков курса: при установке программ, настройке служб, написании скриптов и администрировании серверов.
Список изученных тем
- Понятие файловой системы и inode.
- Стандарт FHS и назначение основных системных папок Linux.
- Абсолютные и относительные пути, обозначения
.,..,~. - Навигация:
cd,ls(со всеми ключевыми опциями-l,-a,-h,-R,-t),pwd. - Работа с файлами:
touch,cat,cp,mv,rm. - Работа с папками:
mkdir(с-p),rmdir,rm -r. - Жёсткие и символические ссылки:
ln,ln -s. - Поиск файлов:
find,locate,which,whereis. - Скрытые файлы и техническая природа записей
./...
Рекомендации перед переходом
Прежде чем двигаться дальше, убедитесь, что вы можете уверенно, без обращения к конспекту, создать вложенную структуру папок, скопировать, переместить и безопасно удалить файлы, отличить абсолютный путь от относительного и объяснить разницу между двумя типами ссылок. Это тот самый случай, когда практика важнее теоретического запоминания — если необходимо, вернитесь и повторите практические шаги нескольких уроков этого блока ещё раз, прежде чем переходить к Блоку 6, где мы будем строить на этой основе более сложные конструкции: конвейеры команд и обработку текста.