Урок 2. Файлы и папки: пути, создание, копирование и удаление
В Linux все файлы лежат в одном дереве папок, и начинается оно с корня — папки /. Букв дисков, как C: и D: в Windows, нет: второй диск или флешка появляются папкой внутри этого же дерева. Папку в Linux часто называют каталогом или директорией — это одно и то же.
Главные папки
| Папка | Что в ней |
|---|---|
/ | корень, начало всего дерева |
/home/ivan | домашняя папка пользователя ivan: его документы и настройки |
/root | домашняя папка администратора root |
/etc | настройки системы и программ — обычные текстовые файлы |
/var/log | журналы (логи) системы и программ |
/usr/bin | программы, которые запускаются командами |
/tmp | временные файлы, система может их удалять |
/mnt и /media | подключённые диски и флешки |
Свои файлы держите в домашней папке: там у вас все права и sudo не нужен.
Пути
Путь — адрес файла в дереве. Допустим, в домашней папке такие файлы:
/home/ivan
├── notes.txt
└── projects
└── site
├── index.html
└── css
└── style.css- Абсолютный путь начинается с
/и работает из любой папки:/home/ivan/projects/site/index.html. - Относительный путь отсчитывается от текущей папки. Если вы в
/home/ivan, тот же файл —projects/site/index.html, а если в/home/ivan/projects/site/css—../index.html. .— текущая папка,..— папка уровнем выше.~— домашняя папка:~/notes.txt— это/home/ivan/notes.txtдля ivan.
Относительный путь удобен, но зависит от того, где вы стоите. Если команда пишет No such file or directory, первым делом проверьте pwd. В скриптах надёжнее абсолютные пути.
Файлы и папки, имя которых начинается с точки (.bashrc, .ssh), — скрытые: в них обычно лежат настройки. ls их не показывает, ls -a — показывает. Расширение в имени (.txt) в Linux не обязательно, это просто часть имени: можно ли запустить файл как программу, решают права доступа, а не .sh или .exe в конце.
Создать
mkdir practice
cd practice
mkdir -p projects/site/css
touch notes.txtmkdirсоздаёт папку. С ключом-p— сразу всю цепочку вложенных папок и без ошибки, если папка уже есть.touchсоздаёт пустой файл (а у существующего обновляет время изменения).
Фигурные скобки создают несколько похожих имён за раз: mkdir -p site/{css,js,img} — то же, что три папки site/css, site/js и site/img. Скобки раскрывает сама оболочка, ещё до запуска команды.
Скопировать
cp notes.txt notes-copy.txt
cp notes.txt projects/
cp -r projects projects-backupcp что кудакопирует файл. Если куда — папка, копия ляжет в неё под тем же именем.- Папку целиком копирует
cp -r(recursive — со всем содержимым). cp -aкопирует папку вместе с правами и датами файлов — так делают резервные копии.
cp молча заменяет файл с тем же именем в месте назначения. С ключом -i команда спросит разрешения: cp -i notes.txt projects/.
Если папки назначения нет, cp notes.txt backup создаст файл с именем backup. Косая черта в конце (backup/) говорит, что нужна именно папка: если её нет, будет ошибка, а не странный файл.
Перенести и переименовать
mv notes-copy.txt old-notes.txt
mv old-notes.txt projects/
mv projects/site projects/webmv и переносит, и переименовывает — для Linux это одно действие: поменять путь файла. Папки переносятся без ключа -r. Как и cp, mv молча заменяет одноимённый файл; ключ -i заставит спросить.
Шаблоны имён
Оболочка умеет подставлять имена файлов по шаблону:
*— любые символы:ls *.txt— все файлы на.txtв текущей папке;?— ровно один символ:ls photo?.jpgнайдётphoto1.jpg, но неphoto10.jpg;[abc]— один из перечисленных символов:ls report[12].txt.
Шаблон раскрывает оболочка, а команда получает уже готовый список имён. Поэтому шаблоны работают с любой командой: cp *.jpg photos/, mv *.log old/. Скрытые файлы * не захватывает. Если под шаблон ничего не подошло, команда получит сам шаблон как есть и сообщит, что файла *.jpg нет.
Удалить
rm notes.txt
mkdir empty-folder
rmdir empty-folder
rm -r projects-backup
rm -ri projectsrmудаляет файлы.rmdirудаляет только пустую папку — безопасный способ.rm -rудаляет папку со всем содержимым.rm -riделает то же, но спрашивает про каждый файл.rm -rfудаляет без вопросов и не сообщает о ненайденных файлах (f— force, силой).
У командной строки нет корзины: rm удаляет сразу и навсегда. Одна лишняя буква или пробел — и пропадёт не то: rm -rf ~/ tmp (лишний пробел) вместо rm -rf ~/tmp удалит всю домашнюю папку. Перед удалением выполните ls с тем же путём или шаблоном и посмотрите, что попадёт под команду. С sudo ошибка может стоить всей системы: rm -rf /* не защищён ничем.
Особенно осторожно — с переменными в путях. Если переменная dir окажется пустой, rm -rf "$dir"/* превратится в rm -rf /*. В скриптах проверяйте такие переменные заранее (как — в уроке Условия и циклы в скриптах bash).
Ссылки на файлы
Символическая ссылка — ярлык, который указывает на другой файл или папку:
ln -s /var/www/site ~/siteСначала пишется, на что ссылка указывает, потом — где её создать. Теперь cd ~/site ведёт в /var/www/site. В выводе ls -l ссылка видна так: site -> /var/www/site. Удаление ссылки (rm ~/site) не трогает то, на что она указывает.
Коротко
- Дерево начинается с
/, домашняя папка —~,.— здесь,..— уровнем выше. - Абсолютный путь — от
/, относительный — от текущей папки (pwd). mkdir -p— создать папки,touch— пустой файл,cp -r— копировать папку,mv— перенести или переименовать.*и?— шаблоны имён, их раскрывает оболочка.rmудаляет навсегда; передrm -rиrm -rfпроверяйте путь черезls.