Глиф Учебники

Урок 2. Файлы и папки: пути, создание, копирование и удаление

Курс «Командная строка Linux» · урок 2 из 10 · 5 минут чтения

В 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 A notes.txt projects site index.html css B style.css абсолютный — из любой папки /home/ivan/projects/site/index.html A относительный — из /home/ivan projects/site/index.html B относительный — из папки css ../index.html .. — это папка site
К файлу index.html ведут абсолютный путь от корня, относительный projects/site/index.html из /home/ivan и ../index.html из папки css.

Относительный путь удобен, но зависит от того, где вы стоите. Если команда пишет No such file or directory, первым делом проверьте pwd. В скриптах надёжнее абсолютные пути.

Файлы и папки, имя которых начинается с точки (.bashrc, .ssh), — скрытые: в них обычно лежат настройки. ls их не показывает, ls -a — показывает. Расширение в имени (.txt) в Linux не обязательно, это просто часть имени: можно ли запустить файл как программу, решают права доступа, а не .sh или .exe в конце.

Создать

Bash
mkdir practice
cd practice
mkdir -p projects/site/css
touch notes.txt

Фигурные скобки создают несколько похожих имён за раз: mkdir -p site/{css,js,img} — то же, что три папки site/css, site/js и site/img. Скобки раскрывает сама оболочка, ещё до запуска команды.

Скопировать

Bash
cp notes.txt notes-copy.txt
cp notes.txt projects/
cp -r projects projects-backup

cp молча заменяет файл с тем же именем в месте назначения. С ключом -i команда спросит разрешения: cp -i notes.txt projects/.

Если папки назначения нет, cp notes.txt backup создаст файл с именем backup. Косая черта в конце (backup/) говорит, что нужна именно папка: если её нет, будет ошибка, а не странный файл.

Перенести и переименовать

Bash
mv notes-copy.txt old-notes.txt
mv old-notes.txt projects/
mv projects/site projects/web

mv и переносит, и переименовывает — для Linux это одно действие: поменять путь файла. Папки переносятся без ключа -r. Как и cp, mv молча заменяет одноимённый файл; ключ -i заставит спросить.

Шаблоны имён

Оболочка умеет подставлять имена файлов по шаблону:

Шаблон раскрывает оболочка, а команда получает уже готовый список имён. Поэтому шаблоны работают с любой командой: cp *.jpg photos/, mv *.log old/. Скрытые файлы * не захватывает. Если под шаблон ничего не подошло, команда получит сам шаблон как есть и сообщит, что файла *.jpg нет.

файлы папки * *.txt photo?.jpg report[12].txt notes.txt report1.txt report2.txt photo1.jpg photo10.jpg .bashrc скрытый набрано ls *.txt оболочка получает команда ls ls notes.txt report1.txt report2.txt
Шаблоны *, ? и квадратные скобки выбирают имена файлов папки, скрытый .bashrc под * не попадает, а готовый список имён подставляет оболочка ещё до запуска ls.

Удалить

Bash
rm notes.txt
mkdir empty-folder
rmdir empty-folder
rm -r projects-backup
rm -ri projects

У командной строки нет корзины: rm удаляет сразу и навсегда. Одна лишняя буква или пробел — и пропадёт не то: rm -rf ~/ tmp (лишний пробел) вместо rm -rf ~/tmp удалит всю домашнюю папку. Перед удалением выполните ls с тем же путём или шаблоном и посмотрите, что попадёт под команду. С sudo ошибка может стоить всей системы: rm -rf /* не защищён ничем.

команда аргументы что удалится rm -rf ~/tmp ~/tmp только папка ~/tmp rm -rf ~/ tmp лишний пробел ~/ tmp вся домашняя папка и папка tmp там, где вы стоите
Лишний пробел превращает путь ~/tmp в два аргумента, ~/ и tmp, и команда rm -rf удаляет всю домашнюю папку.

Особенно осторожно — с переменными в путях. Если переменная dir окажется пустой, rm -rf "$dir"/* превратится в rm -rf /*. В скриптах проверяйте такие переменные заранее (как — в уроке Условия и циклы в скриптах bash).

Ссылки на файлы

Символическая ссылка — ярлык, который указывает на другой файл или папку:

Bash
ln -s /var/www/site ~/site

Сначала пишется, на что ссылка указывает, потом — где её создать. Теперь cd ~/site ведёт в /var/www/site. В выводе ls -l ссылка видна так: site -> /var/www/site. Удаление ссылки (rm ~/site) не трогает то, на что она указывает.

Коротко

Проверьте себя

1. Вы в папке /home/ivan/projects. Какой путь ведёт к файлу /home/ivan/notes.txt?
2. Какая команда переименует файл old.txt в new.txt?
3. Чем rmdir отличается от rm -r?
4. Почему ls * не показывает файл .bashrc?