Линукс
Linux: Файлы, навигация и поиск
Первая часть серии о Linux для DevOps и DevSecOps - разбираем структуру файловой системы, навигацию, работу с файлами, просмотр содержимого и поиск внутри файлов.
Введение
Давайте не будем вдаваться в элементарные подробности терминологии — что такое файловая система и тому подобное. Скажу лишь, что статья подготовлена для новичков и специалистов, желающих обновить свои знания. Я постарался написать коротко и по сути. Всего частей будет 11.
Структура файловой системы
Корневой каталог / - вершина всей иерархии. Всё остальное монтируется внутрь него. Рассмотрим ключевые каталоги подробнее.
/etc
От et cetera или Editable Text Configuration - здесь хранятся конфигурационные файлы всей системы. Настройки служб, сетевых параметров, пользователей - всё сюда. Важные файлы: /etc/passwd (пользователи), /etc/fstab (монтирование файловых систем), /etc/hosts (локальный DNS), /etc/ssh/sshd_config (настройки SSH-сервера).
/var
От variable - данные, которые постоянно меняются в процессе работы: логи (/var/log), почтовые очереди (/var/mail), спулеры (/var/spool), данные веб-серверов (/var/www). Именно сюда смотреть в первую очередь при диагностике проблем.
/proc
Виртуальная файловая система - файлы здесь не хранятся на диске, а генерируются ядром в реальном времени. Предоставляет информацию о запущенных процессах и состоянии ядра. Примеры: /proc/cpuinfo - информация о процессоре, /proc/meminfo - память, /proc/1/ - данные процесса с PID 1.
/sys
Ещё одна виртуальная ФС - интерфейс к устройствам и драйверам ядра. Позволяет читать и изменять параметры ядра и оборудования на лету. Широко используется при работе с сетевыми интерфейсами, дисками и другим железом.
/tmp
Временные файлы. Любой пользователь может создавать файлы здесь. Содержимое обычно очищается при перезагрузке или по таймеру (через systemd-tmpfiles). Не храните здесь ничего важного.
/home
Домашние каталоги обычных пользователей. Каждый пользователь получает свой подкаталог - /home/username. Здесь хранятся личные файлы, конфиги программ (скрытые папки вида .config, .ssh), документы.
/root
Домашний каталог суперпользователя. Намеренно вынесен отдельно от /home - для безопасности и доступности даже при проблемах с монтированием /home.
/dev
Файлы устройств - интерфейсы к аппаратному обеспечению. /dev/sda - первый жёсткий диск, /dev/sda1 - его первый раздел, /dev/null - «чёрная дыра» для ненужного вывода, /dev/zero - источник нулевых байт, /dev/random и /dev/urandom - генераторы случайных данных.
Навигация по файловой системе
ls - просмотр содержимого каталога
ls (от list) выводит список файлов и подкаталогов. Без аргументов показывает текущий каталог.
Флаги можно комбинировать. ls -lah - пожалуй, самая частая комбинация в работе: подробный список, скрытые файлы, читаемые размеры.
cd - смена текущего каталога
cd (от change directory) - основа навигации.
pwd - текущий рабочий каталог
pwd (от print working directory) выводит абсолютный путь к тому месту, где вы сейчас находитесь.
find - поиск файлов и каталогов
find - мощный инструмент для поиска по имени, типу, размеру, правам, времени изменения и многому другому. Ищет рекурсивно в указанной директории.
locate - быстрый поиск по базе данных
locate ищет не на диске в реальном времени, а по заранее собранной базе данных - поэтому работает значительно быстрее find. Минус: база не знает о файлах, созданных после последнего обновления.
tree - дерево каталогов
tree визуализирует структуру каталогов в виде дерева - удобно для быстрого обзора проекта или системной директории.
Работа с файлами и каталогами
cp - копирование
cp (от copy) копирует файлы и каталоги.
mv - перемещение и переименование
mv (от move) - и перемещение, и переименование делается одной командой.
rm - удаление
rm (от remove) удаляет файлы и каталоги.
mkdir - создание каталогов
mkdir (от make directory) создаёт новые каталоги.
mkdir -p незаменим в скриптах: без него команда упадёт с ошибкой при повторном запуске, если каталог уже существует. Флаг решает обе задачи сразу — «если каталог уже есть, всё в порядке; иначе создай его и все промежуточные».
touch - создание файлов и обновление временных меток
touch создаёт пустой файл, если он не существует, или обновляет временные метки у существующего.
ln - создание ссылок
ln (от link) создаёт жёсткие или символические ссылки.
Жёсткая ссылка (hard link) указывает на тот же inode, что и оригинал. Удаление исходного файла не уничтожает данные - они доступны через ссылку. Не работает между разными файловыми системами и не может ссылаться на каталоги.
Символическая ссылка (symlink) - указатель на путь к файлу или каталогу. Аналог ярлыка в Windows. Работает между ФС и с каталогами. При удалении оригинала ссылка становится битой.
stat - подробная информация о файле
stat выводит полную информацию о файле: размер, тип, inode, права доступа, владелец, три временные метки.
Три временные метки:
- Access - последнее чтение файла
- Modify - последнее изменение содержимого
- Change - последнее изменение метаданных (права, владелец)
file - определение типа файла
file анализирует содержимое файла и определяет его тип - независимо от расширения.
Просмотр содержимого файлов
cat - вывод содержимого файла
cat (от concatenate) выводит содержимое одного или нескольких файлов. Лучше всего подходит для коротких файлов.
less - постраничный просмотр
less - интерактивный просмотрщик для больших файлов. Не загружает весь файл в память, поэтому отлично работает с гигантскими логами.
Управление внутри less:
| Клавиша | Действие |
|---|---|
Space / f | Следующая страница |
b | Предыдущая страница |
g | Начало файла |
G | Конец файла |
/текст | Поиск вперёд |
?текст | Поиск назад |
n | Следующее совпадение |
N | Предыдущее совпадение |
q | Выход |
more - упрощённый постраничный просмотр
more - предшественник less, умеет только прокручивать вперёд. Использовать less предпочтительнее, но more гарантированно есть на любой POSIX-совместимой системе.
head - первые строки файла
head по умолчанию выводит первые 10 строк файла.
tail - последние строки файла
tail по умолчанию выводит последние 10 строк.
tail -f - отслеживание файла в реальном времени
Флаг -f (от follow) держит файл открытым и выводит новые строки по мере их появления. Незаменим для мониторинга логов.
Поиск внутри файлов
grep - поиск текста по шаблону
grep (от global regular expression print) ищет строки по шаблону в файлах или потоке данных. Одна из самых используемых команд в Linux.
grep -r - рекурсивный поиск
grep -E - расширенные регулярные выражения
-E (или egrep) включает поддержку расширенного синтаксиса регулярных выражений.
awk - обработка и извлечение полей
awk - язык для построчной обработки текста. Особенно силён при работе с табличными данными, логами и файлами с разделителями.
Базовая модель: awk 'условие { действие }' файл. По умолчанию разделитель - пробел/tab, поля: $1, $2, …, $NF (последнее поле), $0 - вся строка.
sed - потоковый редактор
sed (от stream editor) обрабатывает текст построчно - заменяет, удаляет, вставляет, фильтрует. По умолчанию не изменяет исходный файл, а выводит результат в stdout.
В следующей части - пользователи и группы: создание, управление, /etc/passwd, /etc/shadow, sudo и всё что с этим связано. а пока держите Linux Cheatsheet — Файловая система
Навигация
| Команда | Описание |
|---|---|
pwd | Показать текущий каталог |
cd /path | Перейти в каталог |
cd .. | На уровень вверх |
cd ~ | В домашний каталог |
cd - | В предыдущий каталог |
ls | Содержимое текущего каталога |
ls -l | Подробный список (права, владелец, размер) |
ls -a | Включая скрытые файлы |
ls -lah | Подробно + скрытые + читаемый размер |
ls -lt | Сортировка по времени изменения |
ls -lS | Сортировка по размеру |
ls -R | Рекурсивный вывод |
tree | Дерево каталогов |
tree -L 2 | Дерево на 2 уровня вглубь |
tree -d | Только каталоги |
tree -a | Включая скрытые |
Поиск файлов
| Команда | Описание |
|---|---|
find . -name "*.log" | Поиск по имени |
find /etc -type f | Только файлы |
find /etc -type d | Только каталоги |
find /etc -type l | Только символические ссылки |
find / -size +100M | Файлы больше 100 MB |
find /tmp -mtime +7 | Не изменялись более 7 дней |
find / -mmin -60 | Изменялись за последний час |
find / -perm 777 | Файлы с правами 777 |
find /home -user username | Файлы конкретного пользователя |
find /tmp -name "*.tmp" -delete | Найти и удалить |
locate filename | Быстрый поиск по базе данных |
locate -i filename | Поиск без учёта регистра |
sudo updatedb | Обновить базу данных locate |
Работа с файлами и каталогами
| Команда | Описание |
|---|---|
touch file.txt | Создать пустой файл |
mkdir dir | Создать каталог |
mkdir -p a/b/c | Создать вложенные каталоги |
cp file.txt copy.txt | Копировать файл |
cp -r dir1 dir2 | Копировать каталог рекурсивно |
cp -p file.txt copy.txt | Копировать с сохранением метаданных |
mv old.txt new.txt | Переименовать файл |
mv file.txt /tmp/ | Переместить файл |
rm file.txt | Удалить файл |
rm -r dir/ | Удалить каталог рекурсивно |
rm -rf dir/ | Принудительное удаление без подтверждения |
ln file.txt hardlink.txt | Создать жёсткую ссылку |
ln -s file.txt symlink.txt | Создать символическую ссылку |
stat file.txt | Подробная информация о файле |
file file.txt | Определить тип файла |
Просмотр содержимого
| Команда | Описание |
|---|---|
cat file.txt | Вывести содержимое файла |
cat -n file.txt | С номерами строк |
less file.txt | Постраничный просмотр (интерактивный) |
less -N file.txt | С номерами строк |
more file.txt | Постраничный просмотр (упрощённый) |
head file.txt | Первые 10 строк |
head -n 20 file.txt | Первые 20 строк |
tail file.txt | Последние 10 строк |
tail -n 20 file.txt | Последние 20 строк |
tail -f file.txt | Слежение за файлом в реальном времени |
tail -F file.txt | Слежение с учётом ротации файла |
Поиск внутри файлов
| Команда | Описание |
|---|---|
grep "text" file.txt | Поиск строк по шаблону |
grep -i "text" file.txt | Без учёта регистра |
grep -n "text" file.txt | С номерами строк |
grep -c "text" file.txt | Подсчитать совпадения |
grep -v "text" file.txt | Инвертировать (строки БЕЗ шаблона) |
grep -l "text" *.txt | Только имена файлов с совпадениями |
grep -w "word" file.txt | Только целые слова |
grep -A 3 "text" file.txt | 3 строки после совпадения |
grep -B 2 "text" file.txt | 2 строки до совпадения |
grep -C 2 "text" file.txt | По 2 строки до и после |
grep -r "text" . | Рекурсивный поиск |
grep -rl "text" . | Рекурсивно, только имена файлов |
grep -E "(err warn)" file | Расширенные регулярные выражения |
grep -E "^root" file | Строки начинающиеся с “root” |
grep -E "bash$" file | Строки заканчивающиеся на “bash” |
awk '{print $1}' file | Вывести первый столбец |
awk -F: '{print $1}' file | Разделитель двоеточие |
awk 'NR==5' file | Вывести только 5-ю строку |
awk 'END{print NR}' file | Подсчитать строки |
sed 's/old/new/g' file | Заменить все вхождения |
sed -i 's/old/new/g' file | Заменить в самом файле |
sed -i.bak 's/old/new/g' file | Заменить с созданием backup |
sed '/^$/d' file | Удалить пустые строки |
sed '/^#/d' file | Удалить строки с комментариями |
sed -n '5,10p' file | Вывести строки 5-10 |
Базовые команды терминала
| Команда | Описание |
|---|---|
clear | Очистить терминал |
history | История команд |
history grep "cmd" | Поиск по истории |
!! | Повторить последнюю команду |
!5 | Выполнить команду №5 из истории |
Ctrl + C | Прервать текущую команду |
Ctrl + Z | Приостановить процесс |
Ctrl + L | Очистить терминал (как clear) |
Ctrl + R | Поиск по истории команд |
Ctrl + A | Перейти в начало строки |
Ctrl + E | Перейти в конец строки |
Ctrl + U | Удалить строку до курсора |
Tab | Автодополнение |
man command | Документация по команде |
command --help | Краткая справка |
which command | Путь к исполняемому файлу |
echo "text" | Вывести текст |
exit | Выйти из терминала / сессии |
