Файлы и навигация в Linux
Навигация, создание, копирование и удаление — команды первого дня.
Навигация: pwd, ls, cd
pwd # /work
ls # projects reports
ls -a # + скрытые: . .. .git
cd projects/blog # относительный путь
cd /work # абсолютный, от корня
cd - # назад, где был Относительный путь считается от текущего каталога, абсолютный начинается с /. Скрытые файлы — любые имена с точки: ls их прячет без -a.
Создание: mkdir -p и touch
mkdir docs # один каталог
mkdir -p reports/2026/aug # вся цепочка сразу
touch notes.txt # пустой файл Без -p mkdir падает, если родительских каталогов нет, и ругается File exists на повторный запуск. touch у существующего файла лишь обновляет время изменения.
Копирование и переименование: cp, mv
cp draft.md final.md # копия файла
cp -r projects backup # каталог — только с -r
mv final.md docs/ # переместить
mv draft.md intro.md # переименовать (та же команда) Переименование и перемещение — одна операция mv: меняется путь. cp без -r молча пропускает каталоги: «-r not specified; omitting directory».
Удаление: rm и rm -r
rm notes.txt # файл
rm backup # каталог так нельзя: Is a directory
rm -r backup # каталог со всем содержимым
ls build/*.tmp # СНАЧАЛА проверить маску
rm build/*.tmp # потом удалять Корзины в терминале нет: rm -r удаляет сразу и навсегда, а rm -rf не переспросит даже про защищённые файлы. Перед удалением по маске прогони её через ls.
Просмотр: cat, less, head, tail
cat notes.txt # файл целиком
less app.log # постранично: / поиск, q выход
head -n 20 app.log # первые 20 строк
tail -n 20 app.log # последние 20
tail -f app.log # следить за живым логом cat хорош для коротких файлов, длинные листай в less. tail -f не завершается и печатает дописываемые строки — стандартный способ смотреть логи; выход Ctrl+C.
Справка: man, --help, which
man ls # полное руководство, q выход
ls --help # короткая выжимка флагов
which ls # /usr/bin/ls — что запускается man листается как less: / ищет, q выходит. which — первый шаг диагностики «команда ведёт себя странно»: показывает, какой именно файл выполняется вместо ожидаемого.
Поиск в Linux: find и grep
find отвечает «какие файлы», grep — «какие строки внутри».
find: поиск файла по имени
find . -name "*.log" # по маске от текущего каталога
find . -iname "APP.LOG" # без учёта регистра
find / -name "config.yaml" 2>/dev/null # по всей системе Маску всегда бери в кавычки: без них шелл раскроет звёздочку по текущему каталогу до запуска find. Хвост 2>/dev/null прячет Permission denied при поиске от корня.
find: по типу и свойствам
find . -type d # только каталоги
find . -type f -name "*.py" # только файлы
find . -type f -mtime -1 # изменённые за сутки
find . -type f -size +100M # больше 100 МБ Условия комбинируются простым перечислением — это логическое И. -mtime считает сутками: -1 значит «моложе 24 часов», +7 — «старше недели».
find -exec: обработать найденное
find . -name "*.log" -exec wc -l {} + # строки в каждом
find . -name "*.tmp" # 1) проверить глазами
find . -name "*.tmp" -exec rm {} + # 2) удалить {} — место подстановки найденного, + собирает все находки в один вызов команды. Перед разрушающим -exec запусти тот же find без него и проверь список.
grep: поиск текста в файле
grep "ERROR" app.log # строки с ERROR
grep -n "ERROR" app.log # + номера строк
grep -in "error" app.log # без учёта регистра grep по умолчанию чувствителен к регистру: без -i строки с error в нижнем регистре молча выпадут из выдачи, и пропажу легко не заметить.
grep -r: поиск по проекту
grep -rn "TODO" . # рекурсивно, файл:строка
grep -rl "TODO" src/ # только имена файлов
grep -rn --exclude-dir=node_modules --exclude-dir=.git "TODO" . Каталог grep сам не обходит — без -r ответит Is a directory. В репозиториях сразу исключай .git и node_modules, иначе выдачу зальёт служебными совпадениями.
grep -v и -c: фильтр и счёт
grep -v "INFO" app.log # строки БЕЗ образца
grep -c "INFO" app.log # только число совпавших строк
ps aux | grep -v grep | grep nginx # классика фильтров -v инвертирует условие, -c печатает счётчик вместо строк. В связке ps | grep сам grep попадает в выдачу — его выкидывают через -v grep (или берут pgrep).