После этого руководства вы сможете удалить файл, пустой каталог, целое дерево каталогов, а также файлы, отобранные по имени или по возрасту, и каждый раз будете проверять цель перед выполнением команды. В командной строке Linux нет корзины: удаление окончательное. Поэтому метод работы важен не меньше, чем сама команда.
Предварительные требования
- Доступ к оболочке на машине с Linux (локально или по SSH), например на VPS с Linux
- Пользователь с правами на запись в нужный каталог (или
sudo) - Свежая резервная копия всего важного
Проверьте цель перед удалением
Перейдите в нужный каталог и выведите его содержимое. Это занимает пару секунд и предотвращает большинство аварий.
Bashpwd ls -la
Если вы работаете с шаблоном (расширение, префикс), сначала посмотрите, что он затронет. Команда rm получит в точности тот же список.
Bashls -d *.log
Удалите файл
Основная команда - rm.
Bashrm report.txt
Добавьте -i, чтобы она запрашивала подтверждение, и -v, чтобы она выводила, что именно удаляет.
Bashrm -iv report.txt
Затем проверьте результат командой ls report.txt: сообщение «No such file or directory» подтверждает, что файл удалён.
Удалите несколько файлов
Подстановочные символы оболочки позволяют выбрать сразу набор файлов. Сначала выведите список через ls, затем удаляйте.
Bashrm -v *.tmp rm -v photo_{01..05}.jpg
Избегайте «голой» звёздочки вроде rm * в каталоге, в содержимом которого вы не уверены. Если имя файла начинается с дефиса, используйте --, чтобы обозначить конец опций:
Bashrm -- -strange-file.txt
Удалите пустой каталог
rmdir удаляет только пустые каталоги. Так задумано: это защита от ошибок.
Bashrmdir old_folder
Чтобы заодно удалить родительские каталоги, которые после этого опустели:
Bashrmdir -p project/cache/tmp
Удалите каталог со всем содержимым
Здесь нужна рекурсивная опция -r. Сначала оцените, что именно вы потеряете.
Bashdu -sh old_project find old_project -type f | wc -l
Затем удалите с подтверждением:
Bashrm -ri old_project
Если файлов тысячи, подтверждения становятся неудобными. Опция -f отключает их:
Bashrm -rf old_project
Никогда не подставляйте в эту команду непроверенную переменную. В rm -rf "$DIR"/ при пустой $DIR целью окажется корневой каталог. В скриптах добавляйте set -u или используйте "${DIR:?}": это прервёт выполнение, если переменная пуста.
Удалите файлы по возрасту
find фильтрует по точным критериям (имя, тип, возраст, размер). Принцип такой: сначала запустите команду без действия, затем добавьте -delete.
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30
Если список совпадает с ожидаемым:
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30 -delete
-mtime +30 означает файлы, изменённые более 30 дней назад. Ставьте -delete последним: find вычисляет условия слева направо, и -delete, поставленный слишком рано, удалит всё подряд.
Надёжно сотрите конфиденциальный файл
rm удаляет запись о файле, но не обязательно сами данные на диске. shred перезаписывает содержимое перед удалением.
Bashshred -u -v secret.key
У этого метода есть ограничения на SSD, в журналируемых файловых системах и на томах со снимками (snapshots): старые данные там могут сохраниться. Для действительно чувствительной информации надёжное решение - шифровать диск с самого начала.
Исправьте типичные ошибки
Permission denied
У вас нет права записи в родительский каталог (именно он управляет удалением, а не сам файл). Проверьте командой ls -ld DIRECTORY, затем при необходимости используйте sudo:
Bashsudo rm -v /path/to/file
Operation not permitted даже с sudo
Вероятнее всего, у файла установлен атрибут неизменяемости. Посмотрите атрибуты, снимите его и удалите файл.
Bashlsattr file.txt sudo chattr -i file.txt sudo rm file.txt
Argument list too long
Подстановка создала больше аргументов, чем принимает система. Воспользуйтесь find, который обрабатывает файлы по одному:
Bashfind . -maxdepth 1 -type f -name "*.tmp" -delete
Directory not empty или Device or resource busy
Первое сообщение от rmdir нормально: в каталоге есть файлы, в том числе скрытые (ls -A). Если каталог занят точкой монтирования или процессом, выясните это с помощью lsof +D DIRECTORY или findmnt, освободите его и повторите попытку.
Чтобы потренироваться без риска, удобен временный сервер: на VPS можно создать тестовый каталог и ошибаться без последствий. Другие руководства такого рода собраны в разделе обучающих материалов.
FAQ
Можно ли восстановить файл, удалённый через rm?
Редко и без гарантий. Такие инструменты, как extundelete или testdisk, иногда находят данные, если сразу прекратить запись на диск. Единственная надёжная защита - резервная копия.
В чём разница между rm -r и rm -rf?
rm -r удаляет рекурсивно, но запрашивает подтверждение для файлов, защищённых от записи. rm -rf принудительно удаляет и молча игнорирует несуществующие файлы. Используйте его, только когда уже проверили цель.
Как удалить каталог, в имени которого есть пробелы?
Возьмите имя в кавычки или экранируйте пробелы: rm -r "My folder" или rm -r My\ folder. Иначе оболочка воспримет каждое слово как отдельный аргумент.
Есть ли корзина в командной строке?
Да, это пакет trash-cli (команда trash-put): он перемещает элементы в корзину пользователя вместо удаления. На сервере он обычно не установлен по умолчанию, поэтому приучите себя сначала выводить список, а потом удалять.