От создания к управлению файлами
В прошлом уроке мы научились создавать директории и пустые файлы через mkdir и touch. У нас появилась учебная директория linux-practice, внутри неё несколько поддиректорий и файлов.
Но в реальной работе файлы редко просто создаются и лежат на месте. Их копируют в резервные директории, переносят между папками проекта, переименовывают, удаляют временные заготовки и очищают старые результаты работы.
В графическом интерфейсе для этого есть привычные действия: скопировать, вставить, переименовать, перетащить мышкой, удалить в корзину. В терминале эти действия выполняются командами.
В этом уроке разберём три основные команды:
cp — копировать файлы и директории.
mv — перемещать и переименовывать.
rm — удалять.
Команды короткие, но важные. Особенно rm: в терминале удаление обычно происходит без корзины, поэтому к нему нужно относиться внимательно.
Сначала вернёмся в нашу учебную директорию:
cd ~/linux-practice
Если вы не выполняли прошлый урок или удалили эту директорию, создайте её заново.
Сначала вернитесь в домашнюю директорию:
cd
Создайте учебную директорию и несколько поддиректорий внутри неё:
mkdir -p linux-practice/src linux-practice/docs linux-practice/config linux-practice/logs
Перейдите внутрь:
cd linux-practice
Создайте несколько файлов:
touch notes.txt plan.txt ideas.txt todo.txt
Добавьте файл внутри src:
touch src/main.py
Проверим, что мы на месте:
ls
Вы должны увидеть примерно такой набор: config, docs, ideas.txt, logs, notes.txt, plan.txt, src, todo.txt.
Копируем файлы через cp
Начнём с копирования. Для этого используется команда cp.
Название можно прочитать как copy — «копировать».
Скопируем файл notes.txt в новый файл notes-copy.txt:
cp notes.txt notes-copy.txt
Здесь notes.txt — источник, а notes-copy.txt — назначение. Мы говорим системе: возьми файл notes.txt и создай рядом его копию с другим именем.
Проверим:
ls
Теперь в директории должны быть оба файла: notes.txt и notes-copy.txt.
Важно не путать копирование с переименованием. После cp исходный файл остаётся на месте. У нас был notes.txt, и он никуда не исчез. Просто появился второй файл с таким же содержимым.
Пока наши файлы пустые, это не очень заметно. Но принцип тот же самый для любых файлов: маленьких заметок, больших логов, скриптов, архивов или конфигов.
Копируем в другую директорию
Чаще файл копируют не рядом, а в другую директорию. Например, мы хотим положить копию плана в директорию docs.
cp plan.txt docs/
Последний аргумент docs/ означает: положи копию внутрь директории docs.
Проверим содержимое docs:
ls docs
Внутри должен появиться файл plan.txt.
Косая черта в конце docs/ показывает, что мы имеем в виду именно директорию. Если директория docs уже существует, команда cp plan.txt docs тоже сработала бы: cp увидел бы, что docs — это директория, и положил бы файл внутрь неё.
Но на первых шагах полезно писать docs/, когда вы хотите положить файл именно внутрь директории. Так команда читается понятнее.
Можно сразу скопировать несколько файлов. В таком случае все аргументы, кроме последнего, считаются источниками, а последний аргумент должен быть директорией назначения.
cp ideas.txt todo.txt docs/
Проверим:
ls docs
Теперь в docs должны лежать копии файлов plan.txt, ideas.txt и todo.txt.
Здесь снова видно, что команда может принимать несколько аргументов. Но у cp важно правильно читать порядок: сначала один или несколько источников, в конце — место, куда копируем.
Копируем директории и флаг -r
С файлами всё довольно просто. С директориями есть одно важное отличие.
Попробуем скопировать директорию docs в директорию docs-backup:
cp docs docs-backup
Скорее всего, вы увидите ошибку примерно такого вида:
cp: -r not specified; omitting directory 'docs'
Это нормальное поведение. По умолчанию cp копирует файлы, но не копирует директории со всем содержимым.
Для копирования директории нужен флаг -r.
cp -r docs docs-backup
Флаг -r означает recursive — «рекурсивно». В простых словах: пройти внутрь директории, скопировать всё содержимое, затем всё содержимое вложенных директорий, если они есть.
Проверим:
ls docs-backup
Внутри docs-backup должны быть те же файлы, что и в docs.
Есть ещё один полезный флаг — -i. Он просит команду спросить подтверждение перед перезаписью существующего файла.
Например, если файл notes-copy.txt уже существует, такая команда может перезаписать его:
cp notes.txt notes-copy.txt
Чтобы команда сначала спросила, используйте -i:
cp -i notes.txt notes-copy.txt
Если файл назначения уже есть, cp задаст вопрос. На первых шагах это хороший способ защититься от случайной перезаписи.
Перемещаем и переименовываем через mv
Теперь перейдём к команде mv.
Название можно прочитать как move — «переместить».
На первый взгляд может быть странно, что одна команда отвечает и за перемещение, и за переименование. Но для файловой системы это близкие действия.
Когда мы переименовываем файл, мы меняем путь к нему: был todo.txt, стал tasks.txt.
Когда мы перемещаем файл в другую директорию, мы тоже меняем путь: был tasks.txt, стал config/tasks.txt.
Именно поэтому для обоих действий используется mv.
Переименуем файл todo.txt в tasks.txt:
mv todo.txt tasks.txt
Проверим:
ls
Файла todo.txt больше нет. Вместо него появился tasks.txt.
Это не копия. Исходное имя исчезло, потому что файл был переименован.
Теперь переместим файл tasks.txt в директорию config:
mv tasks.txt config/
Сначала проверим текущую директорию:
ls
Теперь проверим config:
ls config
В текущей директории файла tasks.txt уже не должно быть. Он должен лежать внутри config.
В отличие от cp, команда mv не оставляет оригинал на старом месте. Она переносит объект.
Можно сразу переместить и переименовать файл:
mv config/tasks.txt docs/tasks-for-project.txt
Теперь файл ушёл из config в docs и одновременно получил новое имя tasks-for-project.txt.
Сначала проверим config:
ls config
Теперь проверим docs:
ls docs
Директории через mv перемещаются и переименовываются без флага -r.
Переименуем директорию docs-backup:
mv docs-backup archive-docs
Проверим:
ls
Директория docs-backup стала archive-docs.
Например:
mv -i notes-copy.txt notes.txt
Если notes.txt уже существует, команда спросит, действительно ли его нужно заменить.
Удаляем файлы через rm
Теперь разберём удаление. Для удаления файлов используется команда rm.
Название можно прочитать как remove — «удалить».
Создадим отдельный временный файл, чтобы удалить именно его:
touch temporary.txt
Проверим:
ls
Теперь удалим файл:
rm temporary.txt
Проверим ещё раз:
ls
Файла temporary.txt больше нет.
Команда rm не переносит файл в корзину. Она удаляет его. Поэтому перед удалением важно смотреть, где вы находитесь и какое имя передаёте команде.
Можно удалить несколько файлов одной командой. Создадим временные файлы:
touch old-1.txt old-2.txt old-3.txt
Удалим их:
rm old-1.txt old-2.txt old-3.txt
Здесь old-1.txt, old-2.txt и old-3.txt — три аргумента команды rm. Команда проходит по каждому имени и удаляет соответствующий файл.
Если хочется, чтобы rm спрашивал подтверждение перед удалением, можно использовать флаг -i.
Сначала создадим файл для проверки:
touch check-before-delete.txt
Теперь попробуем удалить его с подтверждением:
rm -i check-before-delete.txt
Система задаст вопрос. Чтобы подтвердить удаление, обычно вводят y. Чтобы отказаться — n.
Удаляем директории
С директориями есть два варианта.
Если директория пустая, её можно удалить командой rmdir.
Создадим пустую директорию:
mkdir empty-dir
Удалим её:
rmdir empty-dir
Это безопасная команда: она не удалит директорию, если внутри что-то лежит.
Проверим это. Создадим директорию:
mkdir old-data
Теперь создадим файл внутри неё:
touch old-data/file.txt
Попробуем удалить её через rmdir:
rmdir old-data
Вы увидите ошибку примерно такого вида:
rmdir: failed to remove 'old-data': Directory not empty
Команда отказалась удалять непустую директорию. Это ожидаемо.
Чтобы удалить директорию вместе со всем содержимым, используют rm -r:
rm -r old-data
Флаг -r здесь снова означает рекурсивную работу: удалить директорию, зайти внутрь, удалить файлы и вложенные директории.
Хорошая привычка — сначала посмотреть содержимое через ls, а уже потом удалять.
Например, вместо того чтобы сразу выполнять удаление, сначала проверьте:
ls archive-docs
Если вы убедились, что это действительно ненужная учебная копия, удалите её:
rm -r archive-docs
На практике такая пауза перед удалением часто спасает от ошибок. Особенно когда в команде есть длинный путь, маска со звёздочкой или похожие названия директорий.
Что важно помнить про rm -f
У команды rm есть флаг -f. Его название можно читать как force — «принудительно».
Флаг -f отключает часть вопросов и сообщений об ошибках. Например, команда не будет жаловаться, если файла уже нет.
Иногда это удобно в скриптах, где нужно удалить временный файл, если он существует, и спокойно продолжить работу, если его нет.
Но на первых шагах лучше не привыкать добавлять -f автоматически. Если команда ничего не спрашивает и меньше предупреждает, ошибиться проще.
Особенно осторожно нужно относиться к сочетанию rm -rf: оно означает «удалить директорию рекурсивно и без лишних вопросов».
Мы не будем тренироваться на опасных системных путях. Достаточно понять принцип: чем больше команда удаляет и чем меньше она спрашивает, тем внимательнее нужно проверять путь перед запуском.
В этом уроке мы перешли от создания файлов и директорий к управлению ими: научились копировать, перемещать, переименовывать и удалять объекты файловой системы.
cp копирует файлы. Команда читается как cp источник назначение: сначала указывают, что копировать, затем куда или под каким именем создать копию. Если нужно скопировать директорию со всем содержимым, используют cp -r.
mv перемещает и переименовывает файлы и директории. Для файловой системы это похожие действия: в обоих случаях меняется путь к объекту. В отличие от cp, команда mv не оставляет исходный файл на старом месте.
rm удаляет файлы. В терминале обычно нет корзины, поэтому перед удалением нужно внимательно проверять имя файла и текущую директорию.
rmdir удаляет только пустые директории. Если внутри что-то есть, команда откажется работать. Для удаления директории вместе с содержимым используют rm -r.
Флаг -i просит команду спрашивать подтверждение перед опасным действием, например перед перезаписью или удалением. Флаг -f, наоборот, делает команду менее разговорчивой, поэтому использовать его нужно осторожно.
Перед rm -r полезно сначала выполнить ls для той же директории и убедиться, что вы удаляете именно то, что собирались.
В следующем уроке мы начнём смотреть содержимое файлов и разберём, как читать текст прямо в терминале через cat, head, tail и less.
Удаление директории
Какая команда удалит директорию old-data вместе со всем содержимым?
Копировать, переместить, удалить
Соотнесите команду с действием.
Что останется после команды
Отметьте результат выполнения команды.
Вопросы для самоконтроля
Ответьте своими словами.