рм (Unix)

Утилита командной строки Unix
рм
Оригинальный автор(ы)Кен Томпсон , Деннис Ритчи
( AT&T Bell Laboratories )
Разработчик(и)Различные разработчики открытого и коммерческого ПО
Первоначальный выпуск3 ноября 1971 г .; 53 года назад ( 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-frm -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]

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

Реализация 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] [ требуется пояснение ]

Смотрите также

Ссылки

  1. ^ "EFI Shells and Scripting". Intel . Получено 2013-09-25 .
  2. ^ «Unix — Часто задаваемые вопросы (3/7) [Часто публикуемые сообщения]Раздел — Как «восстановить» файл?». www.faqs.org .
  3. ^ "страница rm из раздела 1 руководства unix 8th". man.cat-v.org .
  4. ^ "RM(1)", FreeBSD-5.4-RELEASE , получено 5 февраля 2015 г.
  5. ^ "RM(1)", NetBSD-2.0 , получено 5 февраля 2015 г.
  6. ^ "RM(1)", OpenBSD-3.6 , получено 5 февраля 2015 г.
  7. ^ "rm(1): удаление файлов/каталогов - страница руководства Linux". linux.die.net .
  8. ^ Кшиштоф Гой (22 января 2012 г.). "rm: новая опция --dir (-d) для удаления пустых каталогов". coreutils.git .
  9. ^ Макилрой, МД (1987). Исследовательский ридер Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Bell Labs. 139.
  10. ^ "Нативные порты Win32 некоторых утилит GNU". unxutils.sourceforge.net .
  11. ^ "Shell - KolibriOS вики" . wiki.kolibrios.org .
  12. ^ IBM . "IBM System i Version 7.2 Programming Qshell" (PDF) . IBM . Получено 2020-09-05 .
  13. ^ "rm(1) - Страница руководства Linux". man7.org .
  14. ^ Gite, Vivek. "Linux/UNIX: Удалить файл". Nixcraft . Получено 24 ноября 2011 г.
  15. ^ Панзарино, Мэтью (21 мая 2012 г.). «Как «История игрушек 2» была удалена дважды: один раз случайно, а второй — намеренно». TNW | Медиа . Получено 27 сентября 2022 г.
  16. ^ "Справка и примеры по команде Linux rm". ComputerHope . 24 января 2018 г. Архивировано из оригинала 16 апреля 2016 г. Получено 24 января 2019 г.
  17. ^ МакЭлхерн, Кирк (2 января 2014 г.). «Освойте командную строку: удаление файлов и папок». Macworld . Получено 24 января 2019 г. .
  18. ^ "Вмешательство в дела волшебников". Архивировано из оригинала 2016-11-03.
  19. ^ "Предыдущий коммит добавил код в rm(1) для предупреждения и удаления любых · freebsd/freebsd@d6b7bd9". GitHub .
  20. ^ "Вызов rm (GNU Coreutils)". www.gnu.org .
  21. ^ "Safe-rm в Launchpad". Launchpad .
  22. ^ "andreafrancia/trash-cli". 12 сентября 2020 г. – через GitHub.
  23. ^ "Как обойти ограничение Linux "слишком много аргументов"". Stackoverflow . С присоединением ARG_MAX к ulim -s / 4 появилась MAX_ARG_STRLEN как макс. длина аргумента [...] MAX_ARG_STRLEN определяется как 32-кратный размер страницы в linux/include/uapi/linux/binfmts.h [...] Размер страницы по умолчанию составляет 4 КБ, поэтому вы не можете передавать аргументы длиннее 128 КБ [...]
  24. ^ "Linux_2_6_23 - Новички в ядре Linux". kernelnewbies.org .
  25. ^ "kernel/git/torvalds/linux.git - Исходное дерево ядра Linux". git.kernel.org .
  26. ^ ""Список аргументов слишком длинный": За пределами аргументов и ограничений | Linux Journal". www.linuxjournal.com .

Дальнейшее чтение

Взято с "https://en.wikipedia.org/w/index.php?title=Rm_(Unix)&oldid=1268423341"