Создание, копирование, перемещение и удаление
mkdir создаёт каталоги, cp копирует файлы (-r для деревьев), mv перемещает или переименовывает, rm удаляет навсегда — корзины нет. rm -rf — самая опасная команда новичка: необратимо уничтожает целые деревья каталогов.
Навигация по файловой системе — это только половина дела. Настоящая работа означает создание каталогов проекта, копирование конфигурационных файлов, переименование результатов и очистку временных файлов. Четыре команды охватывают всё это: mkdir, cp, mv и rm. Одна из них — rm с двумя флагами — самая разрушительная команда, с которой сталкивается новичок. Тебе нужны все четыре, и нужно знать, какая из них не имеет отмены.
К концу урока ты сможешь создавать деревья каталогов, копировать файлы и папки, переименовывать или перемещать что угодно в файловой системе и удалять файлы — понимая, почему rm -rf заслуживает особой осторожности.
После этого урока ты сможешь использовать mkdir (с -p для вложенных каталогов), cp (с -r для каталогов), mv (как для перемещения, так и для переименования) и rm (с -r и -f с чётким пониманием риска). Ты сможешь предсказать результат каждой команды до её запуска.
mkdir создаёт каталог. Передай одно или несколько имён — и она создаст их в текущем каталоге (или по указанному пути):
mkdir projects
mkdir /tmp/sandboxФлаг -p (parents) создаёт все промежуточные каталоги сразу и не выдаёт ошибку, если они уже существуют. Без -p создание a/b/c при отсутствии a/b завершится ошибкой:
# завершается ошибкой, если projects/ ещё не существует
mkdir projects/backend/src
# успешно: создаёт projects/, projects/backend/, projects/backend/src/
mkdir -p projects/backend/src-p — это флаг, который ты будешь использовать почти каждый раз при создании вложенных путей в скриптах.
cp копирует файлы. Синтаксис: cp ИСТОЧНИК НАЗНАЧЕНИЕ:
cp notes.txt notes-backup.txt # копировать в том же каталоге
cp notes.txt /tmp/notes.txt # копировать в другой каталог
cp /etc/hosts ~/hosts-backup # скопировать системный файл домойЕсли НАЗНАЧЕНИЕ — существующий каталог, а не путь к файлу, cp помещает копию внутрь этого каталога, сохраняя исходное имя файла:
cp notes.txt backups/ # создаёт backups/notes.txtЧтобы скопировать каталог и всё его содержимое, добавь -r (recursive — рекурсивно):
cp -r projects/ projects-backup/Без -r попытка скопировать каталог вызывает ошибку: cp: omitting directory 'projects/'.
mv перемещает или переименовывает. Синтаксис: mv ИСТОЧНИК НАЗНАЧЕНИЕ. Когда НАЗНАЧЕНИЕ находится в том же каталоге — это переименование. Когда НАЗНАЧЕНИЕ — другой каталог — это перемещение. Когда НАЗНАЧЕНИЕ — другой каталог и другое имя — это и то, и другое:
mv draft.txt final.txt # переименовать на месте
mv final.txt ~/documents/ # переместить в documents/
mv draft.txt ~/documents/final.txt # переместить и переименоватьВ отличие от cp, mv не оставляет оригинал. На одной файловой системе mv мгновенна — она просто обновляет запись в каталоге (данные не копируются). Между файловыми системами mv копирует, а затем удаляет.
rm удаляет файлы навсегда — корзины нет. В отличие от графического файлового менеджера, rm не отправляет файлы в восстанавливаемое место. Как только они удалены, они исчезают навсегда (если только нет резервной копии или инструментов для форензики):
rm old-log.txt
rm /tmp/scratch.txtЧтобы удалить каталог и всё его содержимое, добавь -r (рекурсивно). Добавь -f (force — принудительно), чтобы подавить запросы подтверждения и игнорировать отсутствующие файлы:
rm -r old-project/
rm -rf temp/Комбинация -rf мощна и необратима. Смотри Inset ниже.
Создание структуры проекта с нуля.
# 1. Создать дерево каталогов одной командой
mkdir -p myapp/src myapp/tests myapp/docs# 2. Проверить
ls myapp/docs src tests# 3. Скопировать шаблонный файл конфигурации в проект
cp /etc/hostname myapp/docs/hostname-reference.txt# 4. Переименовать конфиг во что-то понятное
mv myapp/docs/hostname-reference.txt myapp/docs/server-info.txt# 5. Очистить устаревший временный файл
rm myapp/docs/server-info.txtКаждый шаг детерминирован: mkdir -p никогда не выдаёт ошибку, если дерево уже существует; cp всегда оставляет источник нетронутым; mv удаляет источник; rm удаляет цель навсегда.
▸Частая ошибка
rm -rf необратима и игнорирует все защитные механизмы.
-r означает «рекурсивно спуститься в каждый подкаталог». -f означает «принудительно: подавить все запросы и игнорировать отсутствующие файлы». Вместе они бесшумно удалят целое дерево каталогов — включая символические ссылки, указывающие за пределы дерева, и всё, на что у текущего пользователя есть права на запись.
Классическая катастрофа:
# Намерение: удалить каталог сборки 'dist'
rm -rf dist/
# Опечатка с пробелом: удаляет 'dist' И всё остальное в /
rm -rf dist /
# ^ пробел перед / → два аргумента: "dist" и "/"Пробел между dist и / превращает один аргумент в два. Оболочка видит rm -rf dist / — удалить dist, затем удалить / (корень файловой системы). На системе без защиты это уничтожает ОС.
Правила, которые нужно усвоить:
- Всегда делай
echoпути передrm -rf, если не уверен:echo rm -rf "$DIR". - Определяй
DIRв переменной и проверяй, что она не пустая, перед использованием. - Используй
rm -ri(интерактивно) при обучении — он спрашивает перед каждым удалением. - Никогда не запускай
rm -rfот root, пока не проверил каждый аргумент.
▸Почему это работает
На macOS cp и mv работают идентично. rm также не имеет корзины — тот же риск применим. Одно отличие: на macOS cp не поддерживает -r для рекурсивного копирования точно так же, как GNU cp; используй -R (заглавная R) на macOS, когда -r неоднозначен. В скриптах, нацеленных на обе системы, -R — безопасный выбор.
Ты запускаешь: cp report.pdf archive/. Каталог archive/ уже существует и пуст. Каков результат?
mkdir создаёт каталоги; добавь -p, чтобы создавать вложенные пути без ошибок. cp ИСТОЧНИК НАЗНАЧЕНИЕ копирует файлы и, с -r, целые деревья каталогов — источник всегда сохраняется. mv ИСТОЧНИК НАЗНАЧЕНИЕ перемещает или переименовывает; источник исчезает, а на одной файловой системе операция мгновенна. rm навсегда удаляет файлы — корзины нет. rm -rf — самая разрушительная распространённая команда: она рекурсивно и принудительно удаляет целые деревья без подтверждения и без возможности восстановления. Всегда проверяй аргументы перед её запуском, и используй rm -ri при сомнении.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.