Удаление всех файлов в директории — частая задача при обслуживании серверов: очистка логов, кэша, временных файлов, содержимого бакапов. Способов несколько, и выбор зависит от того, нужно ли удалить скрытые файлы, сохранить вложенные папки или удалить всё рекурсивно.
rm: базовое удаление
Удалить все обычные файлы в текущей директории:
rm /path/to/folder/*
Символ * — glob-маска, которую оболочка раскрывает в список всех файлов директории. Папки и скрытые файлы при этом не затрагиваются.
Важно: rm удаляет файлы мгновенно и без корзины. Отменить операцию невозможно. Всегда проверять путь перед выполнением.
Удалить файлы с подтверждением каждого
rm -i /path/to/folder/*
Флаг -i (interactive) запрашивает подтверждение перед удалением каждого файла. Замедляет процесс, но страхует от случайного удаления не того.
Удалить включая скрытые файлы
Файлы, начинающиеся с точки (.bashrc, .env, .htaccess), не попадают под маску *. Для их удаления использовать .[!.]*:
rm /path/to/folder/* /path/to/folder/.[!.]*
Маска .[!.]* захватывает файлы начиная с . но исключает . и .. (текущую и родительскую директорию). Это важно — удаление . или .. приведёт к катастрофе.
В bash можно включить dotglob — тогда * будет включать скрытые файлы:
shopt -s dotglob
rm /path/to/folder/*
shopt -u dotglob # выключить обратно
Удалить всё рекурсивно (файлы и вложенные папки)
rm -rf /path/to/folder/*
-r — рекурсивно (включая вложенные директории), -f — без запросов подтверждения (force). Вместе — самая мощная и самая опасная комбинация.
⚠️ Никогда не выполнять
rm -rf /илиrm -rf /*— это уничтожит всю файловую систему. Дважды проверять путь перед выполнением.
find: точечное удаление с фильтрами
find даёт полный контроль над тем, что именно удалять — по типу, расширению, возрасту, размеру.
Удалить только файлы (не директории) в папке:
find /path/to/folder -maxdepth 1 -type f -delete
-maxdepth 1 — только текущий уровень, не рекурсивно. -type f — только обычные файлы. -delete — удалить найденное.
Удалить файлы рекурсивно во всех вложенных папках:
find /path/to/folder -type f -delete
Удалить файлы по расширению:
find /path/to/folder -name "*.log" -delete
find /path/to/folder -name "*.tmp" -delete
Удалить файлы старше N дней:
find /path/to/folder -type f -mtime +30 -delete
-mtime +30 — файлы, изменённые более 30 дней назад. Полезно для ротации логов.
Удалить файлы больше определённого размера:
find /path/to/folder -type f -size +100M -delete
Предварительно посмотреть, что будет удалено — запустить без -delete, с -print:
find /path/to/folder -type f -mtime +30 -print
Очистить папку, сохранив саму папку и вложенные директории
Иногда нужно удалить все файлы, но оставить структуру папок нетронутой — например, очистить кэш, сохранив директории-плейсхолдеры.
find /path/to/folder -type f -delete
Без -maxdepth 1 команда пройдёт по всем вложенным папкам и удалит все файлы, оставив пустые директории.
rsync: нестандартный, но надёжный способ
Синхронизировать папку с пустой директорией — фактически очищает её:
mkdir /tmp/empty_dir
rsync -a --delete /tmp/empty_dir/ /path/to/folder/
--delete удаляет из целевой директории всё, чего нет в источнике. Источник пустой — значит, цель тоже станет пустой. Работает быстрее rm -rf на папках с миллионами мелких файлов (характерно для кэша PHP или node_modules).
Удалить содержимое, не удаляя саму папку
Иногда важно, чтобы папка осталась с теми же правами и владельцем — удаление и создание заново могут изменить метаданные.
rm -rf /path/to/folder/* /path/to/folder/.[!.]*
Папка остаётся. Удаляется только её содержимое.
Безопасная проверка перед удалением
Перед деструктивной командой — убедиться в правильности пути:
ls /path/to/folder/
Или с echo — посмотреть, что раскроет glob-маска, не удаляя:
echo rm /path/to/folder/*
echo просто напечатает команду с раскрытыми именами файлов. Это безопасный способ проверить, что именно попадёт под удаление.
Частые ошибки
rm: cannot remove '/path/*': No such file or directory Папка пустая или путь неверный. Глоб * не раскрывается в пустой директории — bash передаёт * буквально, и rm не находит такого файла.
Скрытые файлы остались после rm * Маска * не захватывает файлы с точкой. Дополнительно выполнить rm .[!.]* или использовать find.
rm -rf не удаляет директорию целиком Если в команде rm -rf /path/to/folder/* — удаляется содержимое, но не сама папка. Чтобы удалить и папку: rm -rf /path/to/folder.
Нечаянно удалил не ту папку rm не имеет корзины. Восстановление возможно только через инструменты типа extundelete или testdisk — и только если диск не перезаписан. На продакшн-серверах всегда держать бэкапы.
Шпаргалка
| Задача | Команда |
|---|---|
| Удалить все файлы в папке | rm /path/to/folder/* |
| Включая скрытые файлы | rm /path/to/folder/* /path/to/folder/.[!.]* |
| Рекурсивно с подпапками | rm -rf /path/to/folder/* |
| Только файлы через find | find /path/to/folder -maxdepth 1 -type f -delete |
| Рекурсивно только файлы | find /path/to/folder -type f -delete |
| По расширению | find /path/to/folder -name "*.log" -delete |
| Старше 30 дней | find /path/to/folder -type f -mtime +30 -delete |
| Предпросмотр без удаления | find /path/to/folder -type f -mtime +30 -print |
| Быстрая очистка (rsync) | rsync -a --delete /tmp/empty/ /path/to/folder/ |