Linux команди на кожен день: шпаргалка для веброзробника

Інше 23 жовт. 2026 р.
 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 для деплою закривають переважну більшість щоденних задач. А конвеєри дозволяють комбінувати їх у потужні однорядкові рішення.

Порада наостанок: не намагайтеся вивчити все одразу. Збережіть цю статтю, і наступного разу, коли зайдете на сервер, спробуйте зробити задачу командою з неї замість того, щоб відкривати файловий менеджер. За тиждень більшість цих команд ви набиратимете не замислюючись.