Урок 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 получает несколько папок, он выводит содержимое каждой под её именем.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Как переименовать файл notes.txt в todo.txt?
mv перемещает файл, а переместить в новое имя в той же папке — это и есть переименовать. cp оставил бы и старый файл.
-
Команда cp photos backup выдала ошибку. Почему?
Без -r команда копирует только файлы. Параметр -r говорит: скопируй папку со всем содержимым.
-
Что выберет шаблон photos/*.jpg?
Звёздочка заменяет любое количество любых символов. Оболочка сама подставит все подходящие имена.
-
Что безопаснее сделать перед командой rm *.log?
rm удаляет без корзины и обычно без вопросов. Тот же шаблон с ls покажет, что именно удалится.