Оригинальный автор(ы) | Кен Томпсон , Деннис Ритчи ( AT&T Bell Laboratories ) |
---|---|
Разработчик(и) | Различные разработчики открытого и коммерческого ПО |
Первоначальный выпуск | 3 ноября 1971 г ( 1971-11-03 ) |
Написано в | С |
Операционная система | Unix , Unix-подобный , V , Plan 9 , Inferno , KolibriOS , IBM i |
Платформа | Кроссплатформенный |
Тип | Команда |
Лицензия | coreutils : GPLv3+, план 9: лицензия MIT |
rm
(сокращение от remove ) — базовая команда в Unix и Unix-подобных операционных системах, используемая для удаления объектов, таких как компьютерные файлы , каталоги и символические ссылки из файловых систем , а также специальных файлов, таких как узлы устройств , каналы и сокеты , аналогичная del
команде в MS-DOS , OS/2 и Microsoft Windows . Команда также доступна в оболочке EFI . [1]
Команда rm
удаляет ссылки на объекты из файловой системы с помощью системного вызова unlink , где эти объекты могли иметь несколько ссылок (например, файл с двумя разными именами), а сами объекты удаляются только после того, как все ссылки будут удалены и ни одна программа не будет иметь открытых дескрипторов объектов.
Это позволяет реализовать сценарии, в которых программа может открыть файл, немедленно удалить его из файловой системы, а затем использовать его в качестве временного пространства, зная, что пространство файла будет восстановлено после завершения работы программы, даже если она завершится из-за сбоя.
Команда обычно не уничтожает данные файла, поскольку ее цель на самом деле заключается лишь в отсоединении ссылок, а освобожденное пространство файловой системы может все еще содержать оставшиеся данные от удаленного файла. В некоторых случаях это может быть проблемой безопасности, и защищенные версии иногда предусматривают стирание данных при обрыве последней ссылки, а также доступны такие программы, как shred и srm , которые специально предоставляют возможность стирания данных.
rm
обычно встречается только в операционных системах на базе UNIX , которые обычно не предусматривают восстановление удаленных файлов с помощью механизма, подобного корзине , [2] отсюда и тенденция пользователей заключать файлы rm
в какую-либо оболочку, чтобы ограничить случайное удаление файлов.
Существуют утилиты восстановления , которые попытаются восстановить индекс и смогут восстановить файл, если его части не были использованы повторно.
В некоторых старых версиях Unix rm
команда удаляла каталоги, если они были пустыми. [3] Такое поведение все еще можно получить в некоторых версиях rm
с этим -d
флагом, например, BSD (такие как FreeBSD , [4] NetBSD , [5] OpenBSD [6] и macOS ), полученные из 4.4BSD-Lite2.
Версия, rm
входящая в состав GNU coreutils, была написана Полом Рубином, Дэвидом Маккензи, Ричардом Столлманом и Джимом Мейерингом. [7] Эта версия также предоставляет -d
опцию для обеспечения совместимости. [8] Та же функциональность предоставляется стандартной rmdir
командой.
Опция -i
в версии 7 заменила dsw
, или «удалить из переключателей», которая дебютировала в версии 1. Дуг Макилрой писал, что dsw
«был инструментом отчаяния, разработанным для очистки файлов с непроизносимыми именами». [9]
Команда доступна в виде отдельного пакета для Microsoft Windows как часть коллекции UnxUtils собственных портов Win32 распространенных утилит GNU Unix-like. [10] KolibriOS включает реализацию команды . [11] Команда rm также была перенесена в операционную систему IBM i . [12] rm
rm
удаляет файл, указанный после добавления параметров. Пользователи могут использовать полный путь или относительный путь к файлу, чтобы указать файлы для удаления. rm
не удаляет каталог по умолчанию. [13]rm foo
удаляет файл " foo " в каталоге, в котором в данный момент находится пользователь.
rm
, как и другие команды, использует параметры для указания своего поведения:
-r
, «рекурсивный», который удаляет каталоги, предварительно рекурсивно удаляя их содержимое (чтобы не оставлять файлы без каталога для размещения).-i
, «интерактивный», который запрашивает подтверждение каждого удаления.-f
, «force», который игнорирует несуществующие файлы и отменяет любые запросы на подтверждение (фактически отменяя -i
), хотя он не удалит файлы из каталога, если каталог защищен от записи.-v
, "verbose", который выводит rm
на терминал информацию о том, что происходит-d
, "каталог", который удаляет пустой каталог и работает только в том случае, если указанный каталог пуст.--one-file-system
, удаляет только файлы в той же файловой системе, что и аргумент, и игнорирует смонтированные файловые системы.rm
может быть перекрыт псевдонимом оболочки ( псевдоним оболочки C , оболочка Bourne или Bash) функцией " ", чтобы избежать случайного удаления файлов. Если пользователь все же хочет удалить большое количество файлов без подтверждения, он может вручную отменить аргумент, добавив опцию (так как опция, указанная позже в развернутой командной строке " " , имеет приоритет). К сожалению, такой подход порождает опасные привычки к использованию подстановочных знаков, что приводит к собственной версии случайного удаления.rm -i
-i
-f
rm -i -f
rm -rf
(по-разному, rm -rf /
, rm -rf *
, и другие) часто используется в шутках и анекдотах о катастрофах Unix, [14] таких как потеря многих файлов во время производства фильма История игрушек 2 в Pixar . [15] Вариант rm -rf /
команды, запущенный суперпользователем , приведет к удалению с машины всех файлов, доступных из текущей файловой системы.
rm
часто используется вместе с xargs для предоставления списка файлов для удаления:
xargs rm < список_файлов
Или, чтобы удалить все изображения PNG во всех каталогах ниже текущего:
найти . -имя '*.png' -exec rm {} +
Обычно в большинстве файловых систем удаление файла требует разрешения на запись в родительский каталог (и разрешения на выполнение, чтобы войти в каталог в первую очередь). (Обратите внимание, что, что может сбить с толку новичков, разрешения на сам файл не имеют значения. Однако GNU rm
запрашивает подтверждение, если защищенный от записи файл должен быть удален, если только не используется опция -f.) [16]
Чтобы удалить каталог (с помощью rm -r
), нужно рекурсивно удалить все его содержимое. Для этого необходимо иметь разрешение на чтение, запись и выполнение для этого каталога (если он не пустой) и всех непустых подкаталогов рекурсивно (если таковые имеются). Разрешение на чтение необходимо для перечисления содержимого каталога с целью его удаления. Иногда это приводит к странной ситуации, когда непустой каталог не может быть удален, потому что у вас нет разрешения на запись в него, и поэтому вы не можете удалить его содержимое; но если бы тот же каталог был пуст, его можно было бы удалить. [17]
Если файл находится в каталоге с установленным битом закрепления , то для удаления файла необходимо быть его владельцем.
Sun Microsystems представила rm -rf /
защиту " " в Solaris 10, впервые выпущенной в 2005 году. После выполнения команды система теперь сообщает, что удаление / не разрешено. [18] Вскоре после этого та же функциональность была введена в версию утилиты FreeBSDrm
. [19] GNU rm
отказывается выполняться , rm -rf /
если --preserve-root
указана опция, [20] что было значением по умолчанию с версии 6.4 GNU Core Utilities, выпущенной в 2006 году. В более новых системах эта защита от сбоев всегда активна, даже без опции. Чтобы выполнить команду, пользователь должен обойти защиту от сбоев, добавив опцию --no-preserve-root
, даже если он является суперпользователем.
Системные администраторы, дизайнеры и даже пользователи часто пытаются защитить себя от случайного удаления файлов, создавая псевдоним или функцию следующего вида:
псевдоним rm = "rm -i"
rm () { /bin/rm -i " $@ " ; }
Это приводит к тому, rm
что пользователю предлагается подтвердить удаление каждого файла, нажимая клавишу Y или N. К сожалению, это, как правило, приучает пользователей быть небрежными в отношении подстановочных знаков, которые они передают в свои rm
команды, а также поощряет тенденцию попеременно нажимать клавишу «стук» y
и клавишу «возврат» для подтверждения удаления — пока не останется только один файл, который им нужно было сохранить. [ требуется цитата ] Пользователи даже доходили до « », что автоматически вставляет «y» для каждого файла. [ требуется цитата ]yes | rm files
Компромисс, который позволяет пользователям подтверждать данные только один раз, поощряет правильное использование подстановочных знаков и упрощает проверку списка, можно достичь с помощью чего-то вроде:
если [ -n " $PS1 " ] ; тогда rm () { ls -FCsd " $@ " echo 'remove[ny]? ' | tr -d '\012' ; прочитать если [ "_ $REPLY " = "_y" ] ; тогда /bin/rm -rf " $@ " иначе echo '(отменено)' fi } fi
Важно отметить, что эта функция не должна быть сделана в виде скрипта оболочки, что может привести к ее обнаружению раньше системы rm
в пути поиска, и не должна быть разрешена в неинтерактивных оболочках, где она может нарушить пакетные задания. Включение определения в if [ -n "$PS1" ] ; then .... ; fi
конструкцию защищает от последнего.
Существуют сторонние альтернативы, которые предотвращают случайное удаление важных файлов, такие как «safe-rm» [21] или «trash». [22]
Этот раздел может содержать материал, не относящийся к теме статьи . ( Январь 2025 г. ) |
Реализация GNU Core Utilities , используемая в нескольких дистрибутивах Linux , имеет ограничения на аргументы командной строки. Аргументы номинально ограничены 32-кратным размером выделенной ядру страницы. Таким образом, системы с размером страницы 4 КБ будут иметь ограничение на размер аргумента в 128 КБ. [23]
Для аргументов командной строки до версии ядра 2.6.23 (выпущенной 9 октября 2007 г.) ограничения были определены во время компиляции ядра и могут быть изменены путем изменения переменной MAX_ARG_PAGES
в include/linux/binfmts.h
файле. [24] [25]
Новые ядра [ которые? ] ограничивают максимальную длину аргумента до 25% от максимального лимита стека (ulimit -s). Превышение лимита приведет к отображению сообщения об ошибке /bin/rm: Argument list too long.
[26] [ требуется пояснение ]
С присоединением ARG_MAX к ulim -s / 4 появилась MAX_ARG_STRLEN как макс. длина аргумента [...] MAX_ARG_STRLEN определяется как 32-кратный размер страницы в linux/include/uapi/linux/binfmts.h [...] Размер страницы по умолчанию составляет 4 КБ, поэтому вы не можете передавать аргументы длиннее 128 КБ [...]