Графический файловый менеджер удобен, пока у тебя десять файлов. Когда их тысячи, или ты сидишь по SSH на сервере без рабочего стола, мышкой ничего не сделаешь. Этот урок снимает страх перед терминалом: научимся создавать, копировать и удалять файлы одной строкой, собирать команды в конвейеры и написать свой первый bash-скрипт. После него командная строка перестанет быть черным окошком и станет твоим главным инструментом.

Как это работает
В Linux почти все - это файлы, а оболочка (shell, обычно bash или zsh) - это переводчик между тобой и системой. Ты пишешь команду, оболочка ее разбирает, запускает нужную программу и показывает результат. Никакой магии: команда - это просто имя программы плюс аргументы.
Главная идея Unix - маленькие программы, каждая делает одно дело хорошо. Сила в том, что их можно соединять. Одна выводит список файлов, другая считает строки, третья ищет по шаблону. Соедини их трубой (pipe), и получишь инструмент, которого не было ни у кого до тебя.
Чтобы программы соединялись, у каждой есть три стандартных потока. Поток ввода (stdin) - откуда программа читает. Поток вывода (stdout) - куда пишет результат. Поток ошибок (stderr) - куда пишет жалобы, отдельно от результата, чтобы они не смешивались. Перенаправление и конвейеры - это просто игра с тем, куда направить эти потоки: в файл, в другую программу или с экрана.
Команды и примеры
Создаем и организуем файлы. touch создает пустой файл (или обновляет дату), mkdir делает каталог, -p создает всю цепочку сразу.
Код: Выделить всё
touch notes.txt # создать пустой файл
mkdir projects # создать каталог
mkdir -p projects/web/css # создать вложенные каталоги цепочкой
cp notes.txt backup.txt # скопировать файл
cp -r projects archive # скопировать каталог рекурсивно (-r)
mv backup.txt old_notes.txt # переименовать (или переместить)
rm old_notes.txt # удалить файл
rmdir projects/web/css # удалить ПУСТОЙ каталог
Код: Выделить всё
rm -ri myfolder # удалить с подтверждением каждого шага (безопаснее)
rm -rf ./build # снести каталог build В ТЕКУЩЕЙ папке, точка важна
Код: Выделить всё
ls *.txt # все файлы с расширением txt
ls report?.log # report1.log, reportA.log, но не report10.log
ls img[0-9].png # img0.png ... img9.png
rm temp_* # все, что начинается с temp_ (сначала проверь через ls!)
Код: Выделить всё
ls -l > files.txt # вывод в файл (перезапись)
echo "новая строка" >> files.txt # дописать в конец
sort < files.txt # подать файл на вход программе
ls /нет/такого 2> err.log # ошибки в отдельный файл
ls /etc /нет > out.log 2>&1 # и вывод, и ошибки в один файл
Код: Выделить всё
ls | wc -l # сколько файлов в каталоге (посчитать строки)
ls -l | grep ".conf" # показать только строки со словом .conf
cat /etc/passwd | grep root # найти строки про root
dmesg | grep -i usb | tail # последние сообщения ядра про USB
Код: Выделить всё
echo $HOME # домашний каталог
echo $PATH # где система ищет программы
name="Линукс" # своя переменная (без пробелов вокруг =)
echo "Привет, $name"
export EDITOR=nano # передать переменную дочерним процессам
env | grep PATH # посмотреть переменные окружения
Код: Выделить всё
#!/usr/bin/env bash
echo "Привет от первого скрипта"
echo "Файлов в каталоге: $(ls | wc -l)"
echo "Запустил пользователь: $USER"
Код: Выделить всё
chmod +x hello.sh # сделать исполняемым
./hello.sh # запустить (точка-слеш обязательны)
Код: Выделить всё
sudo apt update && sudo apt install tree # Debian/Ubuntu
sudo dnf install tree # RHEL/Fedora
- Пробелы вокруг знака равно в переменных. Правильно name="value", а name = "value" оболочка поймет как команду name. Это классическая ошибка новичка.
- rm -rf без проверки. Сначала сделай ls с тем же шаблоном, убедись, что попадают только нужные файлы, и только потом rm. Лишний пробел в rm -rf / tmp вместо /tmp - катастрофа.
- Один значок больше затирает файл молча. Если важные данные могли быть в файле, используй два значка для дописывания.
- Забыли ./ перед именем скрипта. Просто hello.sh оболочка ищет в каталогах PATH, а текущего каталога там нет из соображений безопасности.
- Пробелы в именах файлов ломают конвейеры. Файл my file.txt оболочка видит как два аргумента. Бери имя в кавычки или избегай пробелов.
- Глобы не раскрылись - значит, совпадений нет. Команда ls *.md без md-файлов выдаст ошибку, это нормально, а не поломка.
- Создай каталог lab и зайди в него: mkdir lab затем cd lab.
- Сделай пять файлов одной командой: touch file1.txt file2.txt file3.txt note.md readme.md.
- Посчитай, сколько txt-файлов, и запиши результат в отчет: ls *.txt | wc -l > report.txt.
- Найди в каталоге все markdown-файлы шаблоном: ls *.md.
- Напиши скрипт info.sh с shebang, который печатает текущий каталог (pwd) и число файлов, сделай chmod +x info.sh и запусти ./info.sh.
- Аккуратно убери за собой: поднимись наверх через cd .. и удали стенд с подтверждением rm -ri lab.
- Чем отличается один значок больше от двух при перенаправлении вывода в файл?
- Что делает конвейер ls | wc -l и какая программа считает строки?
- Почему rm -rf опасна и какие два приема снижают риск удалить лишнее?
- Что подставляет звездочка в шаблоне *.txt и кто ее раскрывает - программа или оболочка?
- Зачем нужна строка shebield (shebang) в начале скрипта и что делает chmod +x?