Введение

Команда утилиты Unix rm (сокращение от remove) — это базовая команда в Unix и Unix-подобных операционных системах, используемая для удаления объектов, таких как компьютерные файлы, каталоги и символические ссылки из файловых систем, а также специальных файлов, таких как узлы устройств, каналы и сокеты, аналогично команде del в MS DOS, OS/2 и Microsoft Windows. Эта команда также доступна в EFI shell.

Обзор

Команда `rm` удаляет ссылки на объекты из файловой системы, используя системный вызов `unlink`. Эти объекты могут иметь несколько ссылок (например, файл с двумя разными именами), а сами объекты удаляются только после того, как все ссылки будут устранены и ни одна программа не будет удерживать открытые дескрипторы к этим объектам. Это позволяет программе открыть файл, немедленно удалить его из файловой системы и затем использовать его как временное хранилище, зная, что место, занимаемое файлом, будет освобождено после завершения работы программы, даже если она завершится аварийно. Команда обычно не уничтожает содержимое файла, поскольку её основная задача – лишь удалять ссылки. Освобожденное место в файловой системе может все еще содержать остатки данных удаленного файла. Это может представлять угрозу безопасности в некоторых случаях, поэтому в усиленных версиях предусмотрена очистка данных при удалении последней ссылки. Существуют также специализированные программы, такие как `shred` и `srm`, которые обеспечивают безопасное удаление данных. `rm` обычно встречается в операционных системах, основанных на UNIX, которые, как правило, не предоставляют механизмов восстановления удаленных файлов, подобных корзине. Поэтому пользователи часто оборачивают `rm` в скрипты-обертки, чтобы предотвратить случайное удаление файлов. Существуют утилиты восстановления, которые пытаются восстановить индекс и вернуть файл, если его части не были перезаписаны.

История

В некоторых старых версиях Unix команда rm удаляла каталоги, если они были пустыми. Такое поведение все еще можно получить в некоторых версиях rm с флагом d, например, в BSD (таких как FreeBSD, NetBSD, OpenBSD и macOS), производных от 4.4BSD Lite2. Версия rm, включенная в GNU coreutils, была написана Полом Рубином, Дэвидом Маккензи, Ричардом Столлманом и Джимом Мейерингом. Эта версия также предоставляет опцию d для обеспечения совместимости. Такая же функциональность обеспечивается стандартной командой rmdir. Опция i в Версии 7 заменила dsw, или "удаление с помощью переключателей", которая впервые появилась в Версии 1. Дуг Макилрой писал, что dsw "был инструментом отчаяния, предназначенным для очистки файлов с непроизносимыми именами". Команда доступна как отдельный пакет для Microsoft Windows в составе коллекции UnxUtils, включающей в себя нативные Win32 порты распространенных утилит GNU Unix. KolibriOS включает реализацию этой команды. Команда также была портирована на операционную систему IBM i.

Разрешения

Обычно, в большинстве файловых систем, удаление файла требует разрешения на запись в родительском каталоге (и разрешения на выполнение, чтобы войти в каталог). (Обратите внимание, что для начинающих пользователей разрешения на сам файл не имеют значения. Однако, GNU rm запрашивает подтверждение, если файл, защищенный от записи, будет удален, если не использовать опцию `f`.) Для удаления каталога (с помощью `rm -r`), необходимо рекурсивно удалить всё его содержимое. Это требует наличия разрешений на чтение, запись и выполнение для этого каталога (если он не пуст) и для всех непустых подкаталогов рекурсивно (если таковые имеются). Разрешения на чтение необходимы для просмотра содержимого каталога с целью его удаления. Это иногда приводит к странной ситуации, когда непустой каталог нельзя удалить, поскольку нет разрешения на запись в него и, следовательно, нельзя удалить его содержимое; но если бы тот же каталог был пуст, его можно было бы удалить. Если файл находится в каталоге с установленным "липким битом", то для его удаления необходимо быть владельцем файла.

Защита корня файловой системы

Sun Microsystems представила защиту от команды "rm rf /" в Solaris 10, впервые выпущенной в 2005 году. При выполнении этой команды система теперь сообщает, что удаление корневого каталога запрещено. Вскоре после этого аналогичная функциональность была добавлена в версию утилиты rm для FreeBSD. GNU rm отказывается выполнять команду "rm rf /", если указана опция "preserve root", которая является опцией по умолчанию, начиная с версии 6.4 GNU Core Utilities, выпущенной в 2006 году. В более новых системах эта предохранительная мера активна постоянно, даже без указания опции. Чтобы выполнить команду, пользователю необходимо обойти эту предохранительную меру, добавив опцию "no preserve root", даже если он является суперпользователем.

Ограничение аргумента максимальной командной строки

Реализация GNU Core Utilities, используемая во многих дистрибутивах Linux, имеет ограничение на количество байтов аргументов командной строки и число страниц, выделяемых в ядре для этих аргументов, в версиях ядра до 2.6.23. В ядре, выпущенном 9 октября 2007 года, это ограничение определялось во время компиляции ядра в переменной MAX_ARG_PAGES в файле include/linux/binfmts.h. Однако, в новых ядрах максимальная длина аргумента ограничена 25% от максимального предела стека (ulimit -s). Если лимит аргументов командной строки превышен, появится сообщение об ошибке: /bin/rm: Список аргументов слишком длинный.