От создания к управлению файлами

В прошлом уроке мы научились создавать директории и пустые файлы через 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.

Удаление директории

11

Какая команда удалит директорию old-data вместе со всем содержимым?

Копировать, переместить, удалить

Соотнесите команду с действием.

cp notes.txt copy.txt
mv notes.txt todo.txt
rm old.txt
rmdir empty-dir
Удалить файл
Удалить пустую директорию
Переименовать файл
Создать копию файла

Что останется после команды

Отметьте результат выполнения команды.

Команда
`cp notes.txt docs/`
`mv notes.txt docs/`
`rm notes.txt`
`rm -r old-data`

Вопросы для самоконтроля

Ответьте своими словами.

1Чем `cp` отличается от `mv`?
2Почему перед `rm -r` полезно сначала выполнить `ls` для той же директории?
3Что произойдёт, если написать `cp plan.txt docs`, когда `docs` не существует?

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.