Як скопіювати багато файлів у Linux?
Перша команда для копіювання, яку ви вивчаєте — це cp. Вона чудово працює, коли треба швидко зробити дублікат конфігураційного файла чи перенести пару текстових документів. Все просто, але рівно доти, доки перед вами не постає завдання перенести скопіювати проєкт із 500 000 дрібних файлів. Тут cp не допоможе.
На це є три технічні причини:
- Відсутність стійкості до збоїв:
cpне вміє перевіряти, що вже скопійовано, а що ні. Вона не підтримує докачування або відновлення сесії. - Однопотокова обробка: команда працює строго в один потік, послідовно відкриваючи й закриваючи кожен файл. Дискова система та мережевий канал більшість часу простоюють у черзі за системними викликами.
- Відсутність зворотного зв’язку: утиліта не виводить поточну швидкість I/O та орієнтовний час до завершення.
Давайте поговоримо про те, що ж робити у цій ситуації.
Які інструменти підходять під ваші завдання
У Linux є набір спеціалізованих утиліт. Вибір конкретного інструмента залежить від того, що саме ви копіюєте: один великий файл, цілий диск чи мільйони дрібних об’єктів.
| Сценарій | Що рекомендуємо використовувати | Чому саме цей інструмент |
| Точкові дрібні операції (1–2 конфіги) | cp | Базовий інструмент, який завжди під рукою |
| Великі файли, резервні копії, SSH-передача | rsync -avP | Уміє відновлювати перерване копіювання та передавати лише зміни |
| Моніторинг пропускної здатності диска/мережі | pv (у конвеєрі) | Показує наочний прогрес-бар і реальну швидкість у MB/s |
| Повний дамп диска або фізичного розділу | dd (з блоком bs=64K/1M) | Працює поблоково на низькому рівні в обхід файлової системи |
| Мільйони дрібних файлів (node_modules, кеш) | find + parallel + rsync | Розподіляє навантаження у декілька паралельних потоків |
Як виконувати копіювання правильно
Нижче розглянемо найефективніші команди та утиліти Linux, які дозволяють переносити будь-які обсяги файлів.
Безпечний перенос із можливістю докачування (rsync)
Якщо вам потрібно перенести папку з даними або відправити дамп на віддалений сервер, використовуйте rsync. Вона автоматично порівнює розміри та часові мітки файлів, тому у разі обриву зв’язку продовжить роботу з місця зупинки.
Для локального копіювання:
rsync -avP /path/to/source/ /path/to/destination/
Для передачі на віддалений сервер через SSH:
rsync -avP /path/to/source/ user@remote-ip:/path/to/destination/
Що означають ці прапори:
-a(archive) — зберігає всі атрибути файлів: права доступу, власників, часові мітки та символьні посилання.-v(verbose) — виводить детальний список файлів у процесі.-P— об’єднує--progress(показ реальної швидкості та прогресу) та--partial(збереження недокачаних файлів для відновлення).
Важливо: якщо ви пишете /source/ (зі слейшем), копіюється лише вміст папки. Якщо вказуєте /source (без слейша), у цільовій директорії створиться підпапка source.
Копіювання з візуалізацією швидкості (pv)
Коли ви переносите один великий tar-архів або дамп бази даних і хочете бачити чіткий прогрес-бар, додайте в конвеєр утиліту pv (Pipe Viewer):
# Пряме копіювання файла з виведенням прогрес-бару
pv /storage/backup.tar > /mnt/external/backup.tar
# Стиснення та перенесення з відстеженням швидкості
pv /storage/database.dump | gzip > /mnt/external/database.dump.gz
Поблокове клонування накопичувачів (dd)
Коли стоїть завдання зробити точну фізичну копію всього диска разом із завантажувачем та розміткою розділів, використовують dd. Щоб процес не розтягувався на цілий день через малий розмір блоку, його обов’язково збільшують:
sudo dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress
- Параметр
bs=64Kзадає оптимальний розмір буфера для послідовного читання. - Параметр
conv=noerror,syncдозволяє не зупинятися при виявленні пошкоджених секторів, заповнюючи їх нулями.
Важливо: Завжди перевіряйте назви дисків через lsblk. Якщо переплутати джерело (if) та ціль (of), ви безповоротно перезапишете свої дані.
Прискорення передачі багатьох дрібних файлів
Найскладніший сценарій — це безліч дрібних файлів. Звичайний rsync працює в один потік і витрачає основний час не на перенесення даних, а на відкриття та закриття системних дескрипторів.
Щоб задіяти всі можливості процесора та диска, розділимо роботу на кілька паралельних процесів за допомогою GNU Parallel:
find /source/directory -mindepth 1 -maxdepth 1 -type d | \
parallel -j 4 rsync -a {} /destination/directory/
Перевірка цілісності даних
Перенесення вважається успішним тільки тоді, коли ви переконалися, що жоден байт не пошкодився в процесі. Для цього порівнюють контрольні суми файлів.
Розраховуємо хеш SHA-256 для вихідного та скопійованого файла:
sha256sum /source/backup.tar /destination/backup.tar
Звіряємо отриманий результат у консолі:
d3b07384d113edec49eaa6238ad5ff00 ... /source/backup.tar d3b07384d113edec49eaa6238ad5ff00 ... /destination/backup.tar
Якщо знаки збігаються повністю — ваші дані перенесені успішно.
Замість висновків
Самостійне опанування складних тем часто вимагає годин пошуку правильних відповідей. Тому структуроване навчання з досвідченими менторами допомагає пройти цей шлях значно швидше та без помилок.
Якщо ви прагнете розібратися з ОС Linux, в ITEDU доступні курси під будь-який рівень підготовки.