Пора обзавестись своими папками
Два предыдущих урока дали нам карту и ноги. Мы знаем, что файлы в Linux собраны в дерево с корнем /, умеем показывать текущее место командой pwd, осматриваться командой ls и переходить между каталогами командой cd. Но пока что мы были только гостями: ходили по чужим каталогам вроде /etc и /home, смотрели на систему со стороны.
Теперь пришло время завести собственное пространство. Мы уже решили, что для учебных материалов вам понадобится личный каталог. Пусть он называется linux-files и находится в вашем домашнем каталоге. Внутри мы сразу создадим структуру, с которой будем работать дальше: место для заметок, черновиков и архива. Это будет не просто упражнение ради упражнения — именно в этих каталогах вы будете хранить файлы на протяжении всего блока.
Задача сегодняшнего урока — научиться создавать каталоги и файлы. Для этого есть две команды: mkdir делает каталог, touch создаёт новый пустой файл. Обе очень простые, но у обеих есть пара неочевидных мест, которые мы разберём на живых примерах.
Сначала проверяем, что свободно
Прежде чем создавать что-то новое, хорошая привычка — посмотреть, что уже есть. Зайдите в домашний каталог и выведите его содержимое:
cd
pwd
ls
Скорее всего, вы увидите пустой вывод или несколько служебных каталогов. Нам важно убедиться, что в домашнем каталоге ещё нет каталога с именем linux-files. Если вы ничего не увидели или в списке нет такого названия, можно спокойно двигаться дальше.
Но что делать, если linux-files уже существует? Такое возможно, если вы уже пробовали создавать что-то раньше или кто-то помогал вам с настройкой. Не удаляйте существующий каталог: в нём могут быть материалы прежней работы. Посмотреть его содержимое через ls можно, но для нового упражнения выберите свободное имя. Просто выберите другое имя. Например, linux-files-2. Всё, что дальше сказано про linux-files, будет относиться к вашему выбранному имени: если вы назвали каталог linux-files-2, подставляйте его во все команды последовательно. Главное — чтобы к началу урока у вас было одно свободное и понятное имя.
mkdir: создаём каталог
Каталог создаётся командой mkdir. Название — сокращение от make directory, то есть «создать каталог». После команды нужно указать имя или путь создаваемого каталога.
Создайте учебный каталог прямо из домашнего:
mkdir linux-files
Внешне команда ничего не сообщит. Пустой вывод после успешного выполнения — обычное поведение многих команд Linux: если нечего сообщить, они молчат. Мы привыкли к этому ещё по cd, и здесь действует то же правило. Команда выполнилась, каталог появился, но сообщать об этом вам не стали.
Проверьте себя:
ls
Теперь в списке есть linux-files. Убедиться в том, что это именно каталог, а не файл, пока можно простым способом — зайти внутрь:
cd linux-files
pwd
pwd покажет /home/student/linux-files или /home/ubuntu/linux-files — смотря как называется ваша учётная запись и какой каталог вы выбрали. Вы стоите внутри только что созданного каталога, и он пуст. Это хорошая отправная точка.
mkdir -p: вложенные каталоги за один раз
Теперь наполним учебный каталог содержимым. Нам нужны три каталога: notes для заметок, drafts для черновиков и archive для того, что потеряло актуальность. Первые три можно создать одной командой, перечислив их через пробел:
mkdir notes drafts archive
Обратите внимание: команда mkdir принимает несколько имён одновременно. Она пройдёт по списку и создаст каждый каталог. Проверьте результат:
ls
Вы увидите три названия: archive, drafts, notes. Они лежат внутри linux-files, потому что именно там вы находились, когда создавали их.
Теперь усложним задачу. Внутри drafts мы хотим завести подкаталог для черновых идей. Можно было бы сначала зайти в drafts, потом создать ideas, потом вернуться обратно. Но есть способ короче. Команда mkdir с опцией -p умеет создавать целую цепочку вложенных каталогов:
mkdir -p drafts/ideas
Что мы здесь написали? drafts/ideas — это относительный путь от текущего каталога. Сейчас вы находитесь в linux-files, поэтому путь ведёт оттуда: войти в каталог drafts, а внутри него создать каталог ideas. Опция -p говорит команде: если какой-то каталог на этом пути ещё не существует, создай и его. В нашем случае каталог drafts уже есть, поэтому команда создаст только недостающий ideas. Но если бы drafts ещё не было, -p спокойно создала бы оба.
Проверим, что получилось, заглянув внутрь drafts:
ls drafts
Теперь там есть ideas. Теперь мы применили знакомую запись пути к созданию вложенного каталога. Такой приём вы будете использовать постоянно: не обязательно заходить в каталог, чтобы создать что-то внутри него. Можно указать путь из того места, где вы стоите.
Ошибка неверного родителя
Здесь уместно разобрать ситуацию, в которую легко попасть. Представьте, что вы хотите создать каталог ideas внутри drafts, но drafts ещё не создан. Если ввести mkdir drafts/ideas без опции -p, система ответит ошибкой. Причина простая: mkdir пытается создать каталог ideas внутри drafts, но не находит родителя. В сообщении об ошибке будет что-то вроде «No such file or directory» — «нет такого файла или каталога». Это не значит, что вы всё сломали. Это значит, что команда не умеет создавать два уровня одновременно без явного разрешения. Опция -p как раз даёт такое разрешение.
Если вы получили такую ошибку, проверьте путь. Прочитайте сообщение: оно подсказывает, какого каталога не хватает. Затем либо создайте родителя отдельной командой mkdir drafts, либо повторите попытку с -p.
Файлы: touch
Каталоги — это каркас. Теперь внутрь нужны файлы, с которыми мы будем работать в следующих уроках. Для создания новых пустых файлов есть команда touch.
Давайте создадим первый учебный файл. Мы планируем завести заметку с планом, и логично положить её в каталог notes:
touch notes/plan.txt
Снова обошлось без перехода внутрь notes. Мы передали относительный путь: каталог notes, а внутри него файл plan.txt. Проверьте:
ls notes
Вы увидите plan.txt. Файл пуст, и это правильно: наполнять его мы будем позже, когда научимся записывать и редактировать текст. Сейчас задача в другом — выстроить структуру и привыкнуть к путям.
Второй файл создадим в черновиках:
touch drafts/task.txt
И проверим:
ls drafts
Теперь в drafts два объекта: каталог ideas и файл task.txt. Обратите внимание, как ls выводит их в общем списке. Цвета могут подсказывать тип объекта, но это зависит от настроек ls и терминала. Мы пока различаем их по контексту: мы сами создавали ideas как каталог, а task.txt как файл. В следующих уроках появятся способы смотреть на это точнее, но сейчас не нужно запоминать их.
Имя с пробелом
До сих пор все наши названия были аккуратными и однословными. Но вы наверняка привыкли, что в повседневной жизни файлы часто называются как-то так: «список книг», «план на неделю». В Linux такие имена тоже возможны, и сейчас самое время научиться с ними работать, чтобы не спотыкаться об них в будущем.
Представьте, что нам нужен файл с названием из двух слов: reading list. Рассмотрим запись с ошибкой. Выполнять её сейчас не нужно:
touch notes/reading list.txt
что произойдёт? Оболочка, как мы уже знаем с урока про date, разделяет текст команды на части по пробелам. После touch получатся два аргумента: notes/reading и list.txt. Команда подумает, что вы хотите создать два файла, и сделает совсем не то, что вы ожидали. В каталоге notes появится файл reading, а в текущем каталоге — файл list.txt.
Чтобы пробел стал частью имени, а не разделителем, нужно заключить весь путь или только нужную часть в кавычки. Мы уже пользовались одинарными кавычками в уроке про формат date. Здесь они работают так же:
touch 'notes/reading list.txt'
Теперь оболочка понимает, что notes/reading list.txt — это один аргумент с пробелом внутри. Проверьте:
ls notes
Вы увидите два файла: plan.txt и reading list.txt. Имя с пробелом создано.
Но на этом история не заканчивается. Пробел останется частью имени, и при каждом следующем обращении к этому файлу кавычки снова понадобятся. Когда в будущем вы захотите, например, прочитать этот файл или переименовать его, команда вида cat notes/reading list.txt без кавычек снова развалится на куски. Поэтому в примерах курса мы будем использовать имена с пробелами редко и обязательно оборачивать их в кавычки при каждом обращении.
Тот же приём работает с именами каталогов. Для нашей учебной структуры пока достаточно файла notes/reading list.txt: при дальнейшем обращении сохраняйте пробел внутри кавычек.
Собираем состояние
Урок подходит к концу, и полезно окинуть взглядом то, что мы построили. Вы находитесь в ~/linux-files. Проверьте себя:
pwd
ls
pwd должен показать домашний каталог и в конце linux-files. А ls — три каталога: archive, drafts, notes. Если вы назвали учебный каталог linux-files-2, пути будут соответствующие.
Теперь загляните внутрь каждого каталога. В notes лежат два файла: plan.txt и reading list.txt. Проверить:
ls notes
В drafts — каталог ideas и файл task.txt:
ls drafts
А archive пуст:
ls archive
Пустой вывод здесь — это не ошибка, а подтверждение: каталог создан, внутри него ничего нет. Он ждёт своего часа, который наступит в следующих уроках, когда мы начнём копировать и перемещать файлы.
Теперь мы готовы двигаться дальше. У нас есть собственный учебный полигон: вложенные каталоги, несколько пустых файлов и общее понимание того, как создавать и проверять структуру. В следующем уроке мы научимся наполнять это пространство: копировать файлы и переносить их из одного каталога в другой.
В этом уроке мы создали собственное учебное пространство: каталог ~/linux-files, внутри него три подкаталога — notes, drafts, archive — и глубже ещё drafts/ideas. Каталоги создаются командой mkdir, а вложенные структуры — mkdir -p, которая умеет создавать недостающие родительские каталоги. Новые пустые файлы создаёт команда touch; на уже существующем файле она ничего не стирает, а только обновляет временные отметки.
Мы разобрали, почему команды обычно молчат об успехе и как читать ошибку «No such file or directory», когда родительского каталога ещё нет. Важным открытием стали имена с пробелами: в наших примерах путь к такому объекту заключён в одинарные кавычки, потому что оболочка разделяет аргументы по пробелам. В учебной структуре теперь лежат файлы notes/plan.txt, notes/reading list.txt и drafts/task.txt.
Вы заводите в домашнем каталоге структуру для занятий Linux. Все действия выполняются в вашей учебной Ubuntu: вы создаёте пробные каталоги и пустые файлы, ничего не удаляя и не затрагивая системные папки.
Постройте дерево одной командой
Вам нужна вложенная структура: каталог projects с подкаталогом archive и внутри archive подкаталог old. Родительских каталогов пока нет. Запишите команду, которая создаст всю цепочку за один вызов mkdir.
Находясь в домашнем каталоге, создайте одной командой путь projects/archive/old. Напишите команду и коротко поясните, почему она не завершится ошибкой «No such file or directory».
Каталог или файл
Вы создали несколько объектов и хотите проверить, чем именно они стали. Решите, какая команда подходит для каждой цели.
Нужно создать пустой файл draft.txt внутри каталога projects. Какая команда подойдёт?
Вы хотите создать каталог с именем reading notes внутри projects. Какая запись сработает так, как задумано?
Создайте структуру из нескольких объектов
Вы решили навести порядок в учебном каталоге и создать сразу несколько элементов. Запишите команды по ситуации.
Находясь в домашнем каталоге, выполните такие действия: создайте каталог practice, внутри него одной командой создайте каталоги notes и drafts, затем создайте пустой файл plan.txt внутри practice/notes и пустой файл с именем todo list.txt внутри practice. Напишите три команды в правильном порядке. Если в имени есть пробел, обязательно покажите, как вы его оформляете.