Урок 3 из 8 · 20 мин · обновлено

Создать, скопировать, переместить, удалить

Как создавать папки и файлы командами mkdir и touch, копировать через cp, перемещать и переименовывать через mv, удалять через rm и почему с rm нужно быть особенно осторожным.

Создать: mkdir и touch

Терминал
cd ~/practice
mkdir archive
mkdir -p projects/site/images
touch readme.txt
  • mkdir — создать папку;
  • mkdir -p — создать сразу всю цепочку вложенных папок. Без -p команда сообщит об ошибке, если папки projects ещё нет;
  • touch — создать пустой файл. Если файл уже есть, touch только обновит дату его изменения.

Копировать и перемещать: cp и mv

Терминал
cp notes.txt notes-copy.txt
cp photos/cat.jpg archive/
cp -r photos photos-backup
  • cp что куда — скопировать файл: под новым именем или в папку;
  • cp -r — скопировать папку со всем содержимым. -r значит «рекурсивно», то есть со всеми вложенными файлами и папками.
Терминал
mv notes-copy.txt archive/
mv readme.txt README.txt

mv перемещает. Переместить файл в новое имя в той же папке — значит переименовать. Отдельной команды для переименования нет.

Осторожно: если файл с таким именем уже есть, cp и mv молча его перезапишут. Параметр -i заставит команду спрашивать разрешения: mv -i a.txt b.txt.

Шаблоны: звёздочка и знак вопроса

Чтобы работать сразу с группой файлов, используют шаблоны:

  • * — любое количество любых символов: *.jpg — все файлы на .jpg;
  • ? — ровно один любой символ: photo?.png подойдёт для photo1.png и photoA.png.
Терминал
ls photos/*.jpg
Результат
photos/cat.jpg  photos/dog.jpg

Шаблон раскрывает оболочка: до запуска команды она заменяет photos/*.jpg на список подходящих имён. Поэтому шаблоны работают с любой командой — ls, cp, mv, rm.

Терминал
mkdir -p photos/jpg
mv photos/*.jpg photos/jpg/

Обе фотографии в JPG переехали в отдельную папку одной командой.

Удалить: rm и rmdir

Терминал
rm archive/notes-copy.txt archive/cat.jpg
rmdir archive
rm -r photos-backup
  • rm — удалить файл;
  • rmdir — удалить пустую папку;
  • rm -r — удалить папку со всем содержимым.

Главное правило: в терминале нет корзины. Удалённое через rm не вернуть. Поэтому:

  • перед удалением по шаблону сначала выполните тот же шаблон с ls и посмотрите, что попадёт под удаление;
  • используйте rm -i — команда спросит подтверждение для каждого файла;
  • никогда не запускайте команды вида rm -rf с путями, в которых не уверены, особенно с sudo. Опечатка в пути может удалить чужие файлы или систему.

Попробуйте сами. В папке ~/practice создайте папку sorted с подпапками images и texts. Скопируйте в images все файлы .png из photos, а в texts — все .txt из practice. Проверьте результат.

Решение
Терминал
cd ~/practice
mkdir -p sorted/images sorted/texts
cp photos/*.png sorted/images/
cp *.txt sorted/texts/
ls sorted/images sorted/texts
Результат
sorted/images:
sea.png

sorted/texts:
README.txt  notes.txt

mkdir -p создал обе папки одной командой. Шаблон *.txt без пути ищет файлы в текущей папке — там лежат notes.txt и переименованный в уроке README.txt. Когда ls получает несколько папок, он выводит содержимое каждой под её именем.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Как переименовать файл notes.txt в todo.txt?

  2. Команда cp photos backup выдала ошибку. Почему?

  3. Что выберет шаблон photos/*.jpg?

  4. Что безопаснее сделать перед командой rm *.log?