Linux команди на кожен день: шпаргалка для веброзробника
Рано чи пізно кожен веброзробник опиняється в терміналі сервера: подивитися логи, знайти файл, що «з'їв» увесь диск, перезапустити сервіс чи залити оновлення. Графічного інтерфейсу там немає, тож усе вирішує знання кількох десятків команд.
У цій статті — не повний довідник, а практичний набір команд Linux, які реально використовуються щодня. Усі приклади перевірені на Ubuntu/Debian, але майже все працює так само на будь-якому дистрибутиві.
Навігація файловою системою
Базові команди, з яких починається будь-яка робота в терміналі:
pwd # де я зараз
ls # що в поточній папці
ls -la # усі файли, включно з прихованими, з правами й розміром
ls -lh # розміри у зручному вигляді (K, M, G)
ls -lt # відсортувати за датою зміни (нові зверху)
cd /var/www # перейти в папку
cd .. # на рівень вище
cd ~ # у домашню папку (або просто cd)
cd - # повернутися в попередню папку
Порада: натискайте Tab для автодоповнення назв файлів і папок. Подвійне Tab покаже всі варіанти. Це економить купу часу й рятує від помилок у шляхах.
Робота з файлами та папками
mkdir backup # створити папку
mkdir -p site/uploads/2026 # створити разом з усіма проміжними папками
touch index.php # створити порожній файл (або оновити дату зміни)
cp config.php config.php.bak # скопіювати файл
cp -r site/ site-copy/ # скопіювати папку рекурсивно
mv old.txt new.txt # перейменувати
mv file.txt /tmp/ # перемістити
rm file.txt # видалити файл
rm -r folder/ # видалити папку з вмістом
rm -i *.log # питати підтвердження для кожного файлу
Обережно з rm -rf. У Linux немає кошика: видалене не відновити. Перед масовим видаленням спершу виконайте ту саму маску через ls, щоб побачити, що саме буде видалено.
Перегляд вмісту файлів
cat file.txt # вивести весь файл
less file.txt # гортати великий файл (q — вийти, / — пошук)
head -n 20 file.txt # перші 20 рядків
tail -n 50 file.txt # останні 50 рядків
tail -f error.log # стежити за файлом у реальному часі
wc -l file.txt # скільки рядків у файлі
tail -f — мабуть, найкорисніша команда для налагодження: відкрийте лог у терміналі, оновіть сторінку в браузері й одразу побачите помилку.
tail -f /var/log/nginx/error.log
tail -f /var/log/apache2/error.log
Пошук файлів: find
find . -name "*.php" # усі PHP-файли в поточній папці й нижче
find /var/www -iname "config*" # без урахування регістру
find . -type d -name "node_modules" # тільки папки
find . -type f -mtime -1 # файли, змінені за останню добу
find . -type f -size +100M # файли, більші за 100 МБ
find . -name "*.log" -mtime +30 -delete # видалити логи, старші за 30 днів
Ключ -mtime -1 особливо корисний після злому сайту: швидко показує, які файли змінювались останнім часом.
Пошук тексту: grep
grep "error" app.log # рядки, що містять error
grep -i "error" app.log # без урахування регістру
grep -rn "DB_PASSWORD" . # рекурсивно по папці, з номерами рядків
grep -rl "base64_decode" --include="*.php" . # тільки назви файлів
grep -v "DEBUG" app.log # усі рядки, КРІМ тих, що містять DEBUG
grep -c "404" access.log # скільки разів зустрічається
grep -A 3 -B 3 "Fatal" error.log # 3 рядки контексту до й після
Конвеєри та перенаправлення
Справжня сила Linux — у поєднанні простих команд. Символ | передає вивід однієї команди на вхід іншої:
# 10 IP-адрес, які найчастіше звертаються до сайту
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# Скільки PHP-файлів у проєкті
find . -name "*.php" | wc -l
# Знайти процес nginx
ps aux | grep nginx
Перенаправлення виводу у файл:
ls -la > list.txt # записати у файл (перезаписати)
echo "done" >> log.txt # дописати в кінець файлу
command 2> errors.txt # тільки помилки у файл
command > out.txt 2>&1 # і вивід, і помилки в один файл
command > /dev/null 2>&1 # повністю приглушити вивід
Масові дії з файлами: пошук і заміна тексту
Змінити домен у сотні файлів, виправити шлях у всіх конфігах чи додати рядок у кожен скрипт — вручну це години роботи, а в терміналі одна команда. Головний інструмент тут — sed, потоковий редактор тексту.
Перед будь-якою масовою заміною зробіть бекап (tar -czf backup.tar.gz site/) або переконайтеся, що проєкт у git. Ключ -i змінює файли одразу, без можливості скасувати.
Заміна в одному файлі
# Спершу подивитися результат, нічого не змінюючи
sed 's/old/new/g' config.php
# Замінити в самому файлі
sed -i 's/old/new/g' config.php
# Те саме, але зберегти копію оригіналу як config.php.bak
sed -i.bak 's/old/new/g' config.php
# Без урахування регістру
sed -i 's/old/new/gI' config.php
Розшифровка: s — substitute (замінити), old — що шукати, new — на що замінити, g — усі входження в рядку (без нього заміниться тільки перше).
Якщо в тексті є слеші (URL, шляхи), використовуйте інший розділювач, щоб не екранувати кожен /:
sed -i 's|http://old-site.com|https://new-site.com|g' index.html
sed -i 's#/var/www/old#/var/www/new#g' nginx.conf
Знайти текст у багатьох файлах і замінити
Класичний рецепт: grep знаходить файли, де є текст, а sed робить заміну тільки в них.
# 1. Подивитися, де саме зустрічається текст
grep -rn "old-site.com" --include="*.php" .
# 2. Замінити в усіх знайдених файлах
grep -rl "old-site.com" --include="*.php" . | xargs sed -i 's|old-site.com|new-site.com|g'
# 3. Перевірити, що нічого не лишилось
grep -rn "old-site.com" --include="*.php" .
Якщо в назвах файлів можуть бути пробіли, використовуйте безпечний варіант з нульовим розділювачем:
grep -rlZ "old-site.com" . | xargs -0 sed -i 's|old-site.com|new-site.com|g'
Те саме через find — зручно, коли треба відфільтрувати файли за типом, датою чи папкою:
# Замінити в усіх .html, крім папки node_modules
find . -name "*.html" -not -path "./node_modules/*" -exec sed -i 's/2025/2026/g' {} +
Дописати текст до або після рядка
sed вміє не лише замінювати, а й вставляти нові рядки поруч зі знайденим:
# Вставити рядок ПІСЛЯ кожного рядка, що містить "DB_HOST"
sed -i '/DB_HOST/a DB_PORT=3306' .env
# Вставити рядок ПЕРЕД рядком, що містить "</body>"
sed -i '/<\/body>/i <script src="/js/analytics.js"></script>' index.html
# Замінити весь рядок, що містить "memory_limit"
sed -i '/memory_limit/c memory_limit = 512M' php.ini
# Видалити всі рядки, що містять "console.log"
sed -i '/console\.log/d' app.js
Запам'ятати просто: a — append (після), i — insert (перед), c — change (замінити рядок), d — delete.
Дописати текст на початок або в кінець файлу
# У кінець файлу
echo "127.0.0.1 mysite.local" >> /etc/hosts
echo "export PATH=\$PATH:~/bin" | tee -a ~/.bashrc # tee зручний разом із sudo
# На початок файлу (перший рядок)
sed -i '1i # Автоматично згенеровано, не редагувати' config.ini
# Останнім рядком через sed
sed -i '$a # end of file' config.ini
Зверніть увагу: sudo echo "..." >> /etc/hosts не спрацює, бо перенаправлення виконується вже без прав root. Правильно — echo "..." | sudo tee -a /etc/hosts.
Дописати текст до кожного рядка
sed -i 's/^/# /' list.txt # на початок кожного рядка (закоментувати)
sed -i 's/$/;/' list.txt # у кінець кожного рядка
sed -i 's/^# //' list.txt # прибрати "# " з початку рядків
Дописати текст у багато файлів одразу
# Додати рядок у кінець кожного .txt у папці
for f in *.txt; do echo "© 2026 coder.org.ua" >> "$f"; done
# Додати заголовок на початок усіх PHP-файлів проєкту, де його ще немає
grep -rL "@license" --include="*.php" src/ | xargs sed -i '2i /** @license MIT */'
# Через find для файлів у всіх підпапках
find . -name "*.css" -exec sh -c 'echo "/* build: $(date +%F) */" >> "$1"' _ {} \;
Ключ grep -L (велика L) повертає файли, де тексту немає — це рятує від дублювання при повторному запуску.
Масове перейменування
# Змінити розширення .jpeg на .jpg
for f in *.jpeg; do mv "$f" "${f%.jpeg}.jpg"; done
# Додати префікс до всіх файлів
for f in *.png; do mv "$f" "old_$f"; done
# Замінити пробіли в назвах на дефіси
for f in *\ *; do mv "$f" "${f// /-}"; done
Перед запуском замініть mv на echo mv — цикл лише виведе команди, і ви побачите, що саме буде перейменовано.
Примітка для macOS: там інша версія sed, і для -i потрібно явно вказати порожнє розширення бекапу: sed -i '' 's/old/new/g' file.
Права доступу та власники
Більшість проблем на кшталт «Permission denied» чи 403 на сайті пов'язані з правами. Права записуються як rwx (читання, запис, виконання) для власника, групи та всіх інших.
ls -l index.php
# -rw-r--r-- 1 www-data www-data 1024 Oct 23 10:00 index.php
chmod 644 index.php # rw-r--r-- типово для файлів
chmod 755 script.sh # rwxr-xr-x типово для папок і скриптів
chmod +x deploy.sh # зробити файл виконуваним
chown www-data:www-data index.php # змінити власника і групу
chown -R www-data:www-data /var/www/site # рекурсивно
Стандартний набір для сайту: папки 755, файли 644, конфіги з паролями — 600 або 640. Розставити права масово:
find /var/www/site -type d -exec chmod 755 {} \;
find /var/www/site -type f -exec chmod 644 {} \;
Ніколи не ставте 777 «щоб запрацювало»: це дає будь-кому право змінювати ваші файли.
Місце на диску
Класика: сайт ліг, бо закінчилось місце. Шукаємо, хто його зайняв:
df -h # вільне місце на всіх дисках
du -sh /var/www # скільки займає папка
du -sh * | sort -rh | head # найбільші папки в поточній директорії
du -h --max-depth=1 /var | sort -rh # розміри підпапок /var
Найчастіші винуватці: старі логи в /var/log, бекапи, кеш і журнал systemd. Журнал можна стиснути до розумного розміру:
sudo journalctl --vacuum-size=200M
Процеси та навантаження
top # процеси в реальному часі (q — вийти)
htop # те саме, але зручніше (sudo apt install htop)
ps aux # список усіх процесів
ps aux | grep php # знайти конкретні
free -h # пам'ять: скільки зайнято і вільно
uptime # час роботи й середнє навантаження
kill 1234 # коректно завершити процес за PID
kill -9 1234 # примусово, якщо процес завис
pkill -f "queue/listen" # завершити за назвою або командою
Три числа load average в uptime — навантаження за 1, 5 і 15 хвилин. Якщо вони стабільно більші за кількість ядер процесора (nproc), сервер не встигає.
Керування сервісами: systemctl
sudo systemctl status nginx # стан сервісу
sudo systemctl restart nginx # перезапустити
sudo systemctl reload nginx # перечитати конфіг без розриву з'єднань
sudo systemctl stop mysql # зупинити
sudo systemctl enable nginx # автозапуск при старті системи
journalctl -u nginx -n 100 # останні 100 записів логу сервісу
journalctl -u php8.3-fpm -f # стежити за логом у реальному часі
Перед перезапуском nginx завжди перевіряйте конфіг: sudo nginx -t. Для Apache аналог — sudo apachectl configtest. Так помилка в конфігу не покладе сайт.
Мережа
ip a # IP-адреси сервера
ping -c 4 google.com # чи є зв'язок
curl -I https://example.com # тільки заголовки відповіді (код, редиректи)
curl -s https://api.example.com/v1/status # запит до API
wget https://example.com/file.zip # завантажити файл
ss -tulpn # які порти слухає сервер і які процеси
ss -tulpn | grep :80 # хто зайняв 80 порт
curl -I зручно використовувати, щоб перевірити редиректи, кешування та SSL без браузера.
Віддалена робота: ssh, scp, rsync
ssh [email protected] # підключитися
ssh -p 2222 [email protected] # нестандартний порт
scp file.zip [email protected]:/tmp/ # скопіювати файл на сервер
scp [email protected]:/var/backup/db.sql . # завантажити з сервера
rsync -avz ./site/ [email protected]:/var/www/site/ # синхронізувати папки
rsync -avz --exclude="node_modules" --dry-run ./ [email protected]:/var/www/site/
rsync передає тільки змінені файли, тому для деплою він значно швидший за scp. Ключ --dry-run покаже, що буде скопійовано, нічого не змінюючи.
Щоб не вводити пароль щоразу, налаштуйте вхід за ключем:
ssh-keygen -t ed25519
ssh-copy-id [email protected]
Архіви
tar -czf site.tar.gz /var/www/site # створити архів .tar.gz
tar -xzf site.tar.gz # розпакувати
tar -xzf site.tar.gz -C /tmp/restore # розпакувати в конкретну папку
tar -tzf site.tar.gz | head # переглянути вміст без розпакування
zip -r site.zip site/ # zip-архів
unzip site.zip -d site/ # розпакувати zip
Запам'ятати ключі tar просто: create, extract, z — gzip, f — файл, t — list.
Пакети
sudo apt update # оновити список пакетів
sudo apt upgrade # оновити встановлені пакети
sudo apt install htop git # встановити
sudo apt remove htop # видалити
apt search redis # знайти пакет
На CentOS, Rocky та Fedora замість apt використовується dnf (або старіший yum) з тими самими підкомандами.
Корисні дрібниці, що економлять час
history # історія команд
history | grep rsync # знайти, як ви робили це минулого разу
!! # повторити останню команду
sudo !! # повторити останню команду з sudo
Гарячі клавіші терміналу:
- Ctrl+R — пошук по історії команд (найкорисніше з усього списку);
- Ctrl+C — перервати команду;
- Ctrl+L — очистити екран;
- Ctrl+A / Ctrl+E — на початок / кінець рядка;
- Ctrl+U — стерти все до курсора.
Довгі команди варто зберегти як аліаси в ~/.bashrc:
alias ll='ls -lah'
alias logs='tail -f /var/log/nginx/error.log'
alias www='cd /var/www'
Після редагування виконайте source ~/.bashrc, щоб аліаси запрацювали без перезаходу.
І ще дві команди, які варто знати, щоб не загубитися:
man grep # повна документація по команді (q — вийти)
grep --help # коротка довідка по ключах
Висновок
Щоб упевнено працювати на сервері, не потрібно знати сотні команд. Навігація, find і grep для пошуку, tail -f для логів, df і du для диска, systemctl для сервісів та rsync для деплою закривають переважну більшість щоденних задач. А конвеєри дозволяють комбінувати їх у потужні однорядкові рішення.
Порада наостанок: не намагайтеся вивчити все одразу. Збережіть цю статтю, і наступного разу, коли зайдете на сервер, спробуйте зробити задачу командою з неї замість того, щоб відкривати файловий менеджер. За тиждень більшість цих команд ви набиратимете не замислюючись.