РМ (Unix)
Оригинальный автор(ы) | Кен Томпсон , Деннис Ритчи ( AT&T Bell Laboratories ) |
---|---|
Разработчик(и) | Различные с открытым исходным кодом и коммерческие разработчики разработчики |
Первоначальный выпуск | 3 ноября 1971 г |
Написано в | С |
Операционная система | Unix , Unix-подобные , V , Plan 9 , Inferno , KolibriOS , IBM i |
Платформа | Кросс-платформенный |
Тип | Команда |
Лицензия | основные утилиты : GPLv3+ План 9: МОЯ лицензия |
rm
(сокращение от «удалить ») — базовая команда в Unix и Unix-подобных операционных системах, используемая для удаления таких объектов, как компьютерные файлы , каталоги и символические ссылки, из файловых систем , а также специальных файлов, таких как узлы устройств , каналы и сокеты , аналогично del
команда в MS-DOS , OS/2 и Microsoft Windows . Команда также доступна в оболочке EFI . [1]
Обзор
[ редактировать ]The rm
команда удаляет ссылки на объекты из файловой системы с помощью системного вызова unlink , где эти объекты могли иметь несколько ссылок (например, файл с двумя разными именами), а сами объекты отбрасываются только тогда, когда все ссылки удалены и нет программ все еще имеют открытые дескрипторы объектов.
Это позволяет реализовать сценарии, в которых программа может открыть файл, немедленно удалить его из файловой системы, а затем использовать его в качестве временного пространства, зная, что пространство файла будет освобождено после завершения работы программы, даже если она закроется из-за сбоя.
Команда обычно не уничтожает данные файла, поскольку на самом деле ее целью является просто разрыв связей, а освобожденное пространство файловой системы все еще может содержать остатки данных из удаленного файла. В некоторых случаях это может быть проблемой безопасности, и усиленные версии иногда предусматривают удаление данных при разрыве последней ссылки, а такие программы, как shred и srm доступны , которые специально обеспечивают возможность очистки данных.
rm
обычно встречается только в операционных системах, производных от UNIX , которые обычно не обеспечивают восстановление удаленных файлов с помощью такого механизма, как корзина , [2] отсюда и тенденция пользователей заключать rm
в какой-то обертке, чтобы ограничить случайное удаление файлов.
Существуют утилиты восстановления , которые попытаются восстановить индекс и вернуть файл, если его части не использовались повторно.
История
[ редактировать ]В некоторых старых версиях Unix rm
команда удалит каталоги, если они пусты. [3] Такое поведение все еще можно получить в некоторых версиях rm
с -d
флаг, например, BSD (например, FreeBSD , [4] НетБСД , [5] OpenBSD [6] и macOS ), полученный из 4.4BSD-Lite2.
Версия rm
пакет GNU coreutils был написан Полом Рубином, Дэвидом Маккензи, Ричардом Столлманом и Джимом Мейерингом. [7] Эта версия также предоставляет -d
вариант, чтобы помочь с совместимостью. [8] Такая же функциональность предусмотрена стандартом. rmdir
команда.
The -i
опция в версии 7 заменена dsw
или «удалить из переключателей», которое дебютировало в Версии 1 . Дуг Макилрой написал это dsw
«был инструментом отчаяния, предназначенным для очистки файлов с непроизносимыми именами». [9]
Команда доступна в виде отдельного пакета для Microsoft Windows как часть UnxUtils коллекции , состоящей из собственных Win32- портов распространенных GNU Unix-подобных утилит. [10] KolibriOS включает в себя реализацию rm
команда. [11] Команда rm также была перенесена в операционную систему IBM i . [12]
Синтаксис
[ редактировать ]rm
удаляет файл, указанный после добавления опций. Пользователи могут использовать полный или относительный путь к файлу, чтобы указать файлы для удаления. rm
по умолчанию не удаляет каталог. [13] rm foo
удаляет файл « foo » в каталоге, в котором в данный момент находится пользователь.
rm
, как и другие команды, использует параметры, чтобы указать, как она будет вести себя:
-r
, «рекурсивный», который удаляет каталоги, предварительно рекурсивно удаляя их содержимое (чтобы не оставлять файлы без каталога для размещения).-i
, «интерактивный», который запрашивает подтверждение каждого удаления.-f
, «принудительный», который игнорирует несуществующие файлы и отменяет любые запросы на подтверждение (фактически отменяя-i
), хотя он не удалит файлы из каталога, если каталог защищен от записи.-v
, «многословный», который печатает то, что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 < filelist
Или, чтобы удалить все изображения PNG во всех каталогах ниже текущего:
find . -name '*.png' -exec rm {} +
Разрешения
[ редактировать ]Обычно в большинстве файловых систем для удаления файла требуется разрешение на запись в родительский каталог (и разрешение на выполнение, чтобы в первую очередь войти в каталог). (Обратите внимание, что, что сбивает с толку новичков, права доступа к самому файлу не имеют значения. Однако GNU rm
запрашивает подтверждение, если файл, защищенный от записи, должен быть удален, если не используется опция -f.) [16]
Чтобы удалить каталог (с помощью rm -r
), необходимо рекурсивно удалить все его содержимое. Для этого необходимо иметь права на чтение, запись и выполнение для этого каталога (если он не пуст) и для всех непустых подкаталогов рекурсивно (если таковые имеются). Разрешения на чтение необходимы для просмотра содержимого каталога и его удаления. Иногда это приводит к странной ситуации, когда непустой каталог невозможно удалить, поскольку у него нет разрешения на запись в него и поэтому невозможно удалить его содержимое; но если бы тот же каталог был пуст, его можно было бы удалить. [17]
Если файл находится в каталоге с установленным битом липкости , то для удаления файла необходимо, чтобы он был владельцем файла.
Защита корня файловой системы
[ редактировать ]Sun Microsystems представила « rm -rf /
» защита в Solaris 10, впервые выпущенная в 2005 году. После выполнения команды система теперь сообщает, что удаление / не разрешено. [18] Вскоре после этого та же функциональность была представлена в FreeBSD . версии rm
полезность. [19] ГНУ rm
отказывается выполнять rm -rf /
если --preserve-root
предоставляется вариант, [20] который используется по умолчанию с момента версии 6.4 GNU Core Utilities выпуска в 2006 году. В новых системах этот отказоустойчивый режим всегда активен, даже без этой опции. Чтобы запустить команду, пользователь должен обойти отказоустойчивость, добавив опцию --no-preserve-root
, даже если они являются суперпользователями.
Проверка пользователя
[ редактировать ]Системные администраторы, дизайнеры и даже пользователи часто пытаются защитить себя от случайного удаления файлов, создавая псевдоним или функцию вроде:
alias rm="rm -i"
rm () { /bin/rm -i "$@" ; }
Это приводит к rm
запросить у пользователя подтверждение для каждого файла, следует ли его удалить, нажав клавишу Y или N. К сожалению, это приучает пользователей небрежно относиться к подстановочным знакам, которые они вводят в свои rm
команды, а также поощрять тенденцию поочередно наносить удары y
и клавиша возврата для подтверждения удаляет - до тех пор, пока не пройдет один файл, который им нужно было сохранить. [ нужна ссылка ] Было замечено, что пользователи даже доходили до " yes | rm files
", который автоматически вставляет "y" для каждого файла. [ нужна ссылка ]
Компромисс, который позволяет пользователям подтвердить только один раз, поощряет правильное использование подстановочных знаков и упрощает проверку списка, может быть достигнут с помощью чего-то вроде:
if [ -n "$PS1" ] ; then
rm ()
{
ls -FCsd "$@"
echo 'remove[ny]? ' | tr -d '\012' ; read
if [ "_$REPLY" = "_y" ]; then
/bin/rm -rf "$@"
else
echo '(cancelled)'
fi
}
fi
Важно отметить, что эту функцию не следует превращать в сценарий оболочки, так как существует риск того, что она будет обнаружена раньше системы. rm
в пути поиска, а также не должно быть разрешено в неинтерактивных оболочках, где это может нарушить пакетные задания. Заключив определение в if [ -n "$PS1" ] ; then .... ; fi
конструкция защищает от последнего.
Существуют сторонние альтернативы, которые предотвращают случайное удаление важных файлов, например «safe-rm». [21] или «мусор». [22]
Ограничение максимального количества аргументов командной строки
[ редактировать ] GNU Core Utilities, Реализация используемая в нескольких дистрибутивах Linux, будет ограничена в байтах аргументов командной строки. Количество страниц, выделенных в ядре для аргументов командной строки до ядра 2.6.23. Выпущено 9 октября 2007 г. [23] [24] были определены во время компиляции ядра в переменной MAX_ARG_PAGES
в include/linux/binfmts.h
файл, но новые ядра ограничивают максимальную длину аргумента до 25% от максимального предела стека (ulimit -s). Ошибка: /bin/rm: Argument list too long.
выдаст запрос, если превышен лимит аргументов командной строки [25]
См. также
[ редактировать ]- srm (Unix) : безопасное удаление файла в Unix.
- unlink() : базовый системный вызов, вызываемый этой программой пользовательского пространства для ее основной функциональности.
- дель (команда)
- Делтри
- dsw (команда) — устаревшая команда Unix для удаления сложных файлов.
Ссылки
[ редактировать ]- ^ «Оболочки EFI и сценарии» . Интел . Проверено 25 сентября 2013 г.
- ^ «Unix — Часто задаваемые вопросы (3/7) [Частые публикации]Раздел — Как «восстановить» файл?» . www.faqs.org .
- ^ "страница rm из раздела 1 8-го руководства unix" . man.cat-v.org .
- ^ «RM(1)» , FreeBSD-5.4-RELEASE , получено 5 февраля 2015 г.
- ^ «RM(1)» , NetBSD-2.0 , получено 5 февраля 2015 г.
- ^ «RM(1)» , OpenBSD-3.6 , получено 5 февраля 2015 г.
- ^ «rm(1): удалить файлы/каталоги — справочная страница Linux» . linux.die.net .
- ^ Кшиштоф Гой (22 января 2012 г.). «rm: новая опция --dir (-d) для удаления пустых каталогов» . coreutils.git .
- ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
- ^ «Собственные порты Win32 некоторых утилит GNU» . unxutils.sourceforge.net .
- ^ «Shell — KolibriOS wiki» . wiki.kolibrios.org .
- ^ ИБМ . «IBM System i Версия 7.2 Программирование Qshell» (PDF) . ИБМ . Проверено 05 сентября 2020 г.
- ^ «rm(1) — страница руководства Linux» . man7.org .
- ^ Гите, Вивек. «Linux/UNIX: удалить файл» . Никскрафт . Проверено 24 ноября 2011 г.
- ^ Панзарино, Мэтью (21 мая 2012 г.). «Как «Историю игрушек 2» удалили дважды: один раз случайно, другой намеренно» . ТНВ | СМИ . Проверено 27 сентября 2022 г.
- ^ «Справка и примеры команд Linux rm» . КомпьютерНадежда . 24 января 2018 года. Архивировано из оригинала 16 апреля 2016 года . Проверено 24 января 2019 г.
{{cite news}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ МакЭлхерн, Кирк (2 января 2014 г.). «Освойте командную строку: Удаление файлов и папок» . Макмир . Проверено 24 января 2019 г.
- ^ «Вмешательство в дела волшебников» . Архивировано из оригинала 03.11.2016.
- ^ «Предыдущий коммит добавил в rm(1) код для предупреждения и удаления любых · freebsd/freebsd@d6b7bd9» . Гитхаб .
- ^ «вызов rm (GNU Coreutils)» . www.gnu.org .
- ^ «Safe-rm в Launchpad» . Панель запуска .
- ^ "Андреафрансия/мусор-кли" . 12 сентября 2020 г. – через GitHub.
- ^ «Linux_2_6_23 — новички в ядре Linux» . kernelnewbies.org .
- ^ «kernel/git/torvalds/linux.git — дерево исходного кода ядра Linux» . git.kernel.org .
- ^ « Слишком длинный список аргументов»: За пределами аргументов и ограничений | Linux Journal» . www.linuxjournal.com .
Дальнейшее чтение
[ редактировать ]- МакЭлхирн, Кирк (2006). Командная строка Mac OS X: Unix под капотом . Джон Уайли и сыновья . ISBN 978-0470113851 .
Внешние ссылки
[ редактировать ]- Единая спецификация UNIX , Версия 4 от The Open Group : удалить записи каталога – Справочник по оболочке и утилитам,
- Plan 9 , том 1 Руководство программиста –
- Inferno по общим командам Руководство –