15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
15.12.2023

Видалення всіх файлів у папці в Linux: повний технічний посібник

Видалення файлів у Linux означає їх остаточне видалення з файлової системи без вбудованого кошика або механізму скасування. Основним інструментом для цієї операції є команда rm, доповнена find, rsync та розширенням glob оболонки — кожен підходить для різних сценаріїв: від видалення одного файлу до масового очищення за критеріями серед мільйонів інодів.

Оскільки видалення файлів у Linux є незворотним за замовчуванням, розуміння точної поведінки кожного методу — включно з тим, як вони обробляють символічні посилання, приховані файли, точки монтування та відкриті файлові дескриптори — не є необов’язковим. Це різниця між чистим завданням з обслуговування та катастрофічною втратою даних у виробничому середовищі.

Чому видалення файлів у Linux потребує точності

Коли ви видаляєте файл за допомогою rm, ядро зменшує кількість жорстких посилань файлу. Фактичні блоки даних звільняються лише тоді, коли ця кількість досягає нуля і жоден процес не утримує відкритий файловий дескриптор до іноду. Це має два практичні наслідки:

  • Запущений процес може продовжувати читати «видалений» файл, якщо він відкрив файловий дескриптор до видалення. Дисковий простір не звільняється, доки процес не закриє дескриптор або не завершиться.
  • Видалення запису каталогу не гарантує негайного звільнення дискового простору на завантажених системах.

У середовищі VPS Хостингу або Виділеного сервера, де кілька служб використовують одну файлову систему, розуміння цієї поведінки запобігає плутанині, коли df не показує звільненого простору після великого видалення.

Метод 1: Базове видалення файлів за допомогою rm

Команда rm є стандартною утилітою POSIX для видалення файлів і записів каталогів.

rm /path/to/filename

Основні прапорці:

ПрапорецьПоведінка
-fПримусове видалення; пригнічує помилки для неіснуючих файлів і ніколи не запитує підтвердження
-iІнтерактивний режим; запитує підтвердження перед кожним видаленням
-IЗапитує один раз перед видаленням більше 3 файлів або рекурсивним обходом
-vДокладний режим; виводить ім’я кожного файлу під час видалення
-r / -RРекурсивний; видаляє каталоги та весь їх вміст

Видалення всіх файлів у каталозі без видалення самого каталогу:

rm /path/to/folder/*

Критична пастка — приховані файли не відповідають шаблону *: Glob * не розширюється до dotfile-файлів (файлів, що починаються з .). Щоб також видалити приховані файли:

rm /path/to/folder/* /path/to/folder/.[!.]* /path/to/folder/..?*

Шаблон .[!.]* відповідає всім dotfile-файлам, крім . та ... Шаблон ..?* охоплює граничні випадки, як-от ..foo. Пропуск цих шаблонів є однією з найпоширеніших помилок під час очищення каталогів конфігурації застосунків.

Метод 2: Рекурсивне видалення за допомогою rm -r

Щоб видалити каталог і все, що в ньому міститься — файли, підкаталоги та їх вміст:

rm -r /path/to/folder/

Це обходить дерево каталогів у глибину, видаляючи файли перед їхніми батьківськими каталогами. На дуже глибоких деревах rm -r може досягти ліміту стека рекурсії ядра, хоча на практиці це трапляється рідко.

Поєднання з -f для неінтерактивного використання в скриптах:

rm -rf /path/to/folder/

Це найнебезпечніша комбінація в адмініструванні систем Linux. Вона видалить усе за вказаним шляхом без будь-якого підтвердження, включно з символічними посиланнями (але не їхніми цілями), спеціальними файлами та каталогами. Без резервної копії шляху до відновлення не існує.

Реальний граничний випадок: Якщо ви випадково додасте пробіл перед шляхом у скрипті:

rm -rf $TARGET_DIR /

Якщо $TARGET_DIR порожній або не встановлений, а в оболонці не ввімкнено nounset (set -u), це розширюється до rm -rf /, що намагається стерти кореневу файлову систему. Завжди використовуйте set -u у виробничих скриптах і беріть змінні в лапки: "$TARGET_DIR".

Метод 3: Видалення за критеріями за допомогою find

Команда find є правильним інструментом, коли потрібно видаляти файли за атрибутами, а не лише за іменем. Вона забезпечує хірургічну точність, якої rm сам по собі не може запропонувати.

Видалення лише звичайних файлів у каталозі (без рекурсії):

find /path/to/folder -maxdepth 1 -type f -delete

Видалення файлів старших за 30 днів:

find /path/to/folder -type f -mtime +30 -delete

Видалення файлів розміром більше 100 МБ:

find /path/to/folder -type f -size +100M -delete

Видалення файлів із певним розширенням:

find /path/to/folder -type f -name "*.log" -delete

Видалення порожніх каталогів після очищення їх вмісту:

find /path/to/folder -type d -empty -delete

find -exec rm проти find -delete

ПідхідМеханізмПродуктивністьБезпека
find ... -exec rm {} ;Породжує новий процес rm для кожного файлуПовільно при великій кількості файлів (накладні витрати на fork)Дещо більш портативний
find ... -exec rm {} +Групує файли в один виклик rmЗначно швидше; подібно до xargsПортативний, ефективний
find ... -deleteСистемний виклик unlinkat() ядра безпосередньо з findНайшвидший; без підпроцесівПотребує впорядкування -depth для каталогів

Завжди надавайте перевагу -delete або -exec rm {} + над -exec rm {} ; при роботі з тисячами файлів. Накладні витрати fork() на кожен файл у формі з крапкою з комою можуть перетворити очищення 100 000 файлів із секунд на хвилини.

Важливе правило впорядкування: При використанні -delete для видалення як файлів, так і їхніх батьківських каталогів за один прохід find, завжди додавайте -depth для обробки вмісту каталогу перед самим каталогом:

find /path/to/folder -depth -delete

Без -depth find може спробувати видалити каталог до його вмісту, що спричинить помилки Directory not empty.

Метод 4: Використання розширення glob оболонки з bash

У сценаріях, де потрібно очистити вміст каталогу без запуску зовнішніх процесів, ефективним є вбудоване розширення glob Bash у поєднанні з rm:

shopt -s dotglob nullglob
rm -rf /path/to/folder/*/
rm -f /path/to/folder/*
shopt -u dotglob nullglob
  • dotglob змушує * включати приховані файли.
  • nullglob запобігає передачі rm літерального *, якщо каталог уже порожній, що спричинило б помилку.

Метод 5: Високопродуктивне видалення за допомогою rsync

Коли каталог містить мільйони файлів, rm -rf може працювати надзвичайно повільно, оскільки повинен окремо виконувати stat() та unlink() для кожного іноду. Відомий прийом системного адміністратора — використовувати rsync для синхронізації порожнього каталогу поверх цільового:

mkdir /tmp/empty_dir
rsync -a --delete /tmp/empty_dir/ /path/to/folder/
rmdir /tmp/empty_dir

rsync використовує високооптимізований обхід каталогів і може перевершити rm -rf на файлових системах із мільйонами дрібних файлів (поширено в поштових спулах, кешах сесій і каталогах сесій PHP). Це практичний прийом на будь-якому Виділеному сервері, що обслуговує застосунки з високим трафіком.

Метод 6: Усічення файлів без їх видалення

Іноді потрібно очистити вміст файлу без видалення іноду — особливо для файлів журналів, які утримує відкритим запущений демон. Видалення та повторне створення файлу порушило б відкритий файловий дескриптор.

Усічення до нуля байтів зі збереженням іноду:

> /path/to/logfile.log

Або еквівалентно:

truncate -s 0 /path/to/logfile.log

Це правильний спосіб очищення активних файлів журналів на живому сервері. Використання rm для відкритого файлу журналу звільняє запис каталогу, але демон продовжує записувати до тепер невидимого іноду, споживаючи дисковий простір до перезапуску процесу.

Порівняння всіх методів видалення

МетодВидаляє приховані файлиРекурсивнийНа основі критеріївПродуктивність на великих наборахРівень ризику
rm fileН/ДНіНіВисокаНизький
rm *Ні (без dotglob)НіНіВисокаСередній
rm -rf dir/ТакТакНіСередняДуже високий
find -deleteТакНалаштовуєтьсяТакВисокаСередній
find -exec rm {} +ТакНалаштовуєтьсяТакСередня-високаСередній
rsync --deleteТакТакНіДуже висока (мільйони файлів)Низький
truncate / >Н/ДНіНіДуже високаДуже низький

Дозволи, власність і sticky bit

Видалення файлів у Linux регулюється дозволами каталогу, а не дозволами файлу. Щоб видалити файл, вам потрібні дозволи на запис (w) та виконання (x) для батьківського каталогу — а не для самого файлу. Це дивує багатьох користувачів, які виявляють, що не можуть видалити файл, яким вони володіють, у каталозі, що належить іншому користувачу.

Sticky bit (chmod +t /dir) для каталогу (найвідоміший приклад — /tmp) обмежує видалення так, що лише власник файлу, власник каталогу або root можуть видаляти файли, незалежно від дозволів на запис до каталогу. Це критично важливо в середовищах спільного хостингу.

На платформі Спільного веб-хостингу sticky bit і правильна власність каталогів запобігають видаленню скриптами одного користувача файлів іншого користувача у спільних тимчасових каталогах.

Безпечний попередній перегляд видалень перед виконанням

Перед запуском будь-якої деструктивної команди у виробничому середовищі перегляньте, що буде видалено:

Попередній перегляд за допомогою find перед видаленням:

find /path/to/folder -type f -mtime +30

Запустіть без -delete спочатку. Передайте через wc -l для підрахунку файлів, що підпадають під дію:

find /path/to/folder -type f -mtime +30 | wc -l

Пробний запуск з rsync:

rsync -a --delete --dry-run /tmp/empty_dir/ /path/to/folder/

Використовуйте ls для перевірки розширення glob:

ls /path/to/folder/* /path/to/folder/.[!.]*

Ніколи не замінюйте цей крок припущеннями, особливо в системах, де змінні середовища визначають шляхи.

Безпечна автоматизація завдань очищення

На виробничих серверах — будь то екземпляри VPS Хостингу або фізичні Виділені сервери — автоматизоване очищення зазвичай керується через cron або таймери systemd. Надійний скрипт очищення повинен дотримуватися таких принципів:

#!/bin/bash
set -euo pipefail

TARGET="/var/app/cache"

# Validate target is not empty and is a directory
if [[ -z "$TARGET" || ! -d "$TARGET" ]]; then
    echo "ERROR: Invalid target directory." >&2
    exit 1
fi

# Delete files older than 7 days
find "$TARGET" -type f -mtime +7 -delete
echo "Cleanup complete: $TARGET"

Ключові захисні заходи в цьому скрипті:

  • set -euo pipefail — завершує роботу при будь-якій помилці, розглядає невстановлені змінні як помилки та перехоплює збої в конвеєрах.
  • Явна перевірка каталогу перед будь-яким видаленням.
  • Змінні в лапках скрізь для запобігання розбиттю слів.

Для веб-застосунків, що керуються через панель управління, VPS з cPanel надає управління завданнями cron через графічний інтерфейс, зменшуючи ризик синтаксичних помилок у запланованих завданнях видалення.

Особливості конкретних файлових систем

Різні файлові системи Linux обробляють видалення по-різному, що впливає як на продуктивність, так і на можливість відновлення:

  • ext4: Використовує журнал. Метадані видаленого файлу журналюються перед звільненням іноду. Деякі криміналістичні інструменти можуть відновити нещодавно видалені файли з журналів ext4.
  • XFS: Оптимізована для великих файлів і високопродуктивного видалення. rm -rf на XFS з мільйонами файлів значно швидше, ніж на ext4, завдяки індексуванню каталогів на основі B-дерева.
  • Btrfs: Підтримує знімки. Видалення файлу в підтомі Btrfs не звільняє простір, якщо знімок посилається на ті самі блоки даних. Завжди перевіряйте використання знімків за допомогою btrfs subvolume list перед очікуванням звільнення дискового простору.
  • tmpfs: Файлова система в пам’яті. Видалення відбувається миттєво, а простір звільняється негайно. Зазвичай використовується для /tmp та зберігання сесій.
  • Монтування NFS: Видалення файлів через NFS створює тимчасові файли .nfsXXXXXX, якщо віддалений процес тримає файл відкритим. Вони очищаються, коли закривається віддалений файловий дескриптор.

Ключовий технічний контрольний список перед видаленням файлів на сервері Linux

  • Підтвердіть точний шлях за допомогою pwd та ls перед виконанням будь-якої команди rm.
  • Використовуйте find без -delete спочатку для попереднього перегляду списку файлів.
  • Перевірте відкриті файлові дескриптори за допомогою lsof +D /path/to/folder перед видаленням файлів у каталогах активних застосунків.
  • Переконайтеся, що жоден запущений процес не залежить від каталогу за допомогою fuser -m /path/to/folder.
  • На Btrfs перевірте знімки перед очікуванням звільнення дискового простору.
  • Використовуйте set -euo pipefail у всіх автоматизованих скриптах видалення.
  • Беріть усі змінні в лапки в скриптах для запобігання випадковому видаленню на рівні root.
  • Для файлів журналів, що утримуються відкритими демонами, використовуйте усічення (> або truncate -s 0), а не rm.
  • На спільних системах перевірте дозволи каталогу та налаштування sticky bit перед тим, як припускати, що видалення буде успішним.
  • Підтримуйте актуальні резервні копії. Жоден метод видалення не є безпечним без перевіреного шляху відновлення.

Часті запитання

З: Чи видаляє rm -rf /path/to/folder/* приховані файли?

Без увімкнення dotglob у Bash glob * не розширюється до файлів, що починаються з крапки. Приховані файли, такі як .env, .htaccess та .gitignore, залишаться. Використовуйте shopt -s dotglob перед командою або явно додайте .[!.]* до шаблону glob.

З: Чому дисковий простір не звільняється одразу після видалення великих файлів?

Якщо запущений процес утримує відкритий файловий дескриптор до видаленого файлу, ядро зберігає виділені блоки даних до закриття цього файлового дескриптора. Використовуйте lsof | grep deleted для визначення процесів, що утримують відкриті видалені файли. Перезапуск відповідної служби або процесу звільнить простір.

З: Який найбезпечніший спосіб очистити каталог, що містить мільйони файлів?

Метод rsync --delete (синхронізація порожнього каталогу поверх цільового) зазвичай є найпродуктивнішим і найменш схильним до помилок підходом для дуже великої кількості файлів. Він дозволяє уникнути обмеження довжини списку аргументів оболонки (E2BIG), на яке може натрапити rm *, і є швидшим за виклики rm для кожного файлу на більшості файлових систем.

З: Чи можна відновити видалені файли в Linux?

За замовчуванням у Linux немає кошика. Однак на файлових системах ext4 нещодавно видалені файли можуть бути відновлені за допомогою таких інструментів, як extundelete або testdisk, якщо диск не зазнав інтенсивного запису після видалення. На Btrfs із увімкненими знімками відновлення є простим через відкат знімка. Саме тому підтримка резервних копій є обов’язковою в будь-якому виробничому середовищі.

З: Як видалити файли в каталозі, не видаляючи сам каталог?

Використовуйте find /path/to/folder -mindepth 1 -delete для видалення всього вмісту — включно з прихованими файлами та підкаталогами — залишаючи батьківський каталог недоторканим. Альтернативно, rm -rf /path/to/folder/* з увімкненим dotglob досягає того самого результату лише для верхнього рівня.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати