Rm rf аналог windows

Обновлено: 05.07.2024

Команда rm -rf / является довольно популярной в узких кругах. Но не потому, что ей постоянно пользуются, а наоборот. Это что-то вроде шутки у заядлых линуксоидов.

Видео: выполнение команды rm -rf / на реальной системе Linux

Все, что вы прочитаете ниже, написано только в информационных целях, не повторяйте этого на своем компьютере.

Команда rm -rf / , выполненная от имени суперпользователя, уничтожит все данные с корневого раздела диска.

Ключ -r используется для того, чтобы выполнять рекурсивный обход всех директорий.
Ключ -f — force — не запрашивать никаких подтверждений.

Если выполнить эту команду в терминале, а именно выполнить:

то появится предупреждение о том, что выполнение команды опасно:

Таким образом программа rm защищает сама себя от плохих действий. Но сразу же сообщает нам, что мы можем использовать ключ --no-preserve-root , чтобы обойти это предупреждение.

Если выполнить команду:

то все данные с корневого раздела диска будут удалены!

Иногда данная команда используется, чтобы «подшутить» над новичками в Linux. Некоторые пользователи на форумах советуют «чайникам» выполнить данную команду, чтобы решить свои проблемы. Чтобы шутка удалась, саму команду иногда маскируют, например, вставляют ее внутрь другой длинной команды, чтобы она не так выделялась.

Процесс работы rm -rf / примерно следующий:

  • Команда выполняется от имени суперпользователя.
  • Копия программы rm загружается в оперативную память.
  • Программа rm начинает удаление всех файлов с корневого раздела /.
  • Во время удаления файлов программа rm в какой-то момент удаляет и саму себя (исполняемый файл программы, файл /bin/rm). Но так как копия программы находится в оперативной памяти, то она продолжает работать, не смотря на то, что исполняемый файл уже удален.
  • Когда удаление файлов завершено, программа rm выгружается из оперативной памяти.
  • На данном этапе в памяти находятся только те программы, которые уже были там до выполнения команды rm (например, ядро, драйвера, окно терминала и так далее).

Очень важный момент, который нужно учитывать. Современные UEFI системы монтируют директорию с прошивками в директорию /sys. Так как rm удаляет все файлы и с примонтированных разделов, то прошивки также будут удалены. Таким образом можно получить не только неработающую систему, но и неработающий компьютер. Будьте внимательны.

Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.

Есть ли для этого готовый инструмент или мне нужно его написать?

DEL /S не удаляет каталоги.

DELTREE был удален из Windows 2000+

Del / s (a) вообще не работает (он доступен только в некоторых версиях) или (b) покидает каталог верхнего уровня, но удаляет все, что находится под ним, или (c) оставляет все каталоги при удалении всех файлов? @Aaron, ответьте c, вам нужно использовать rmdir / s для удаления каталогов и файлов.

21 ответ

RMDIR или RD, если вы используете классическую командную строку (cmd.exe):

RMDIR [/ S] [/ Q] [диск:] путь

RD [/ S] [/ Q] [диск:] путь

/ S Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.

/ Q Тихий режим, не спрашивать, можно ли удалить дерево каталогов с помощью / S

Если вы используете PowerShell, вы можете использовать Remove-Item (который имеет псевдонимы del , erase , rd , ri , rm и rmdir ) и принимает аргумент -Recurse , который можно сократить до -r

Стоит отметить, что для большого количества файлов rmdir / s / q обычно значительно быстрее, чем эквивалентная операция «select dir, shift + delete» в проводнике. Это не удаляет файлы, как это делает rm -rf, и также возвращает ненулевое значение, когда каталог не существует, поэтому rd /s /q foo && echo "yay" завершится ошибкой, если каталог "foo" не существует. Что, если реж. не пусто и одни файлы получают Access is denied , а другие The process cannot access the file because it is being used by another process ? Я как раз на семерке пробовал и нужно делать / S и / Q (заглавные буквы) Мистифицировано здесь. Я знаю , что я пробовал эту команду, и она не работала, если в дереве каталогов были файлы; теперь возвращаюсь и. . . похоже, что это работает волшебным образом. Кто-нибудь еще испытывает непоследовательное поведение с этим ?!

Работает со всем, включая файлы sys

РЕДАКТИРОВАТЬ: Я действительно нашел лучший способ, который также решает проблему слишком длинного пути к файлу:

Мой герой! И один совет: вы создаете свою пустую папку в C: \ empty, а затем, оказавшись внутри каждой сумасшедшей папки, можно просто сделать robocopy /mir c:\empty . takeown помог мне, так как я по ошибке скопировал папку из системы Linux с помощью rsync, и у меня не было прав на удаление этой папки . Даже robocopy не работал. Спасибо Очень хороший ответ. Оно работает. (все остальные ответы на странице - нет). Но cacls устарел. Можно ли дать современный ответ, пожалуйста? Второй вариант уже работает и не является устаревшим. Это мне ничего не дает. Может кто-нибудь объяснить, как это должно работать? (robocopy) - может удалять содержимое папок, но не сами папки. Замените "adminname" на свое фактическое имя учетной записи.

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

/S Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.

/Q Тихий режим, не спрашивать, можно ли удалить дерево каталогов с помощью /S

Спасибо за объяснение параметров. Принятый ответ, к сожалению, этого не делает. Самый простой, идеальный ответ на вопрос. Должен быть принятым.

Вы можете установить cygwin, в котором есть rm , а также ls и т. Д.

Для удаления каталога (независимо от того, существует он или нет) используйте следующее:

Принятый ответ хорош, но если у вас установлен Node, вы можете сделать это гораздо точнее с помощью библиотеки узлов rimraf, которая позволяет использовать шаблоны подстановки. Если вы используете это много (я), просто установите его глобально.

Затем, например, шаблон, который я использую постоянно:

Или для однострочника, который позволяет избежать глобальной установки, но который занимает немного больше времени для динамической загрузки пакета:

Надежное решение проблемы, поскольку оно не зависит от ОС.

Через командную строку

rmdir /S /Q %DIRNAME%

Является наиболее близким из возможных в Windows PowerShell. Это сокращение от

БЛАГОДАРЮ ВАС! Это предложение действительно работало в Терминале Windows.

Вот что вам нужно сделать .

Создайте командный файл со следующей строкой

Сохраните свой командный файл как Remove.bat и поместите его в C:\windows

Создайте следующий раздел реестра

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Запустите regedit и обновите значение по умолчанию HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default со следующим значением

Вот и все! Теперь вы можете щелкнуть правой кнопкой мыши любой каталог и использовать функцию RMDIR.

Использование Powershell 5.1

Замените журналы именем каталога, который вы хотите удалить.

get-childitem выполняет поиск дочернего каталога с именем рекурсивно по текущему пути (.).

remove-item удаляет результат.

Вы можете установить GnuWin32 и использовать команды * nix изначально в Windows. Я устанавливаю это перед установкой чего-либо еще на свежей копии Windows. :)

ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК. ИНФОРМАЦИЯ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ». ДОПОЛНИТЕЛЬНО НЕ ПРОВЕРЕНЫ.

Щелкните правой кнопкой мыши значок Windows (обычно внизу слева)> щелкните «Windows PowerShell (Admin)»> используйте эту команду (при должной осторожности вы можете легко удалить все свои файлы, если не будете осторожны):

Где somedir - это непустой каталог, который вы хотите удалить.

Обратите внимание, что с внешними подключенными дисками или дисками с проблемами Windows иногда ведет себя странно - это не ошибка при удалении (или любой попытке копирования), но каталог не удаляется (или не копируется) в соответствии с инструкциями. (Я обнаружил, что в этом случае, по крайней мере, для меня, команда, заданная @n_y в его ответе, вызовет такие ошибки, как «get-childitem: файл или каталог поврежден и нечитаем». В результате в PowerShell)

ПОЗДНИЙ, НО ВАЖНЫЙ ОТВЕТ всем, у кого возникают проблемы с установкой пакетов npm на компьютере с Windows и если вы видите ошибку: " rm -rf. " команда не найдена. Вы можете использовать bash cli для запуска команды rm в Windows.

Для пользователей npm вы можете изменить конфигурацию npm на npm config set script-shell "C:\Program Files\Git\bin\bash.exe" таким образом, если пакет npm, который вы пытаетесь установить, имеет сценарий после установки, который использует команду rm -rf , вы сможете запустить эту команду rm без необходимости что-либо менять в пакете npm или отключать конфигурацию сценариев после установки . (Например, styled-components использует команду rm в своих сценариях после установки)

Если вы хотите просто использовать команду rm , вы можете легко использовать bash и передавать аргументы.

Итак, да, вы можете использовать команду 'rm' в Windows.

Вот что сработало для меня:

Просто попробуйте уменьшить длину пути. ie :: Переименуйте все папки, которые ведут к такому файлу, на наименьшие возможные имена. Произнесите имена из одной буквы. Продолжайте переименовывать вверх по иерархии папок. Благодаря этому вы эффективно уменьшите длину пути. Теперь, наконец, попробуйте сразу же удалить файл.

Также существует deltree, если вы используете более старую версию Windows.

Каталог del / s / q удален

Попробуйте эту команду:

Работал у меня в сочетании с rmdir / s / q, поскольку некоторые файлы были заблокированы, и rmdir не работал с ними. del / foldername уничтожил заблокированные файлы, что позволило rmdir избавиться от корневого каталога. Отлично.

Во-первых, давайте посмотрим, что делает rm -rf :

Есть три сценария, в которых обычно используется rm -rf , где ожидается возврат 0 :

  1. Указанный путь не существует.
  2. Указанный путь существует и является каталогом.
  3. Указанный путь существует и является файлом.

Я собираюсь проигнорировать всю эту проблему с разрешениями, но никто не использует разрешения и не пытается отказать себе в доступе на запись к вещам в Windows в любом случае (хорошо, это должно быть шуткой . ).

Сначала установите для ERRORLEVEL значение 0, а затем удалите путь, только если он существует, используя разные команды в зависимости от того, не это каталог. IF EXIST не устанавливает для ERRORLEVEL значение 0, если путь не существует, поэтому сначала необходимо установить для ERRORLEVEL значение 0, чтобы правильно определить успех и имитировать нормальный rm -rf использование. Защита RD с помощью IF EXIST необходима, потому что RD , в отличие от rm -f , выдаст ошибку, если цель не существует.

В следующем фрагменте сценария предполагается, что DELPATH заключен в кавычки. (Это безопасно, когда вы делаете что-то вроде SET DELPATH=%1 . Попробуйте поместить ECHO %1 в .cmd и передать ему аргумент с пробелами в нем, и вы сами посмотрите, что произойдет). После завершения фрагмента вы можете проверить наличие сбоя с помощью IF ERRORLEVEL 1 .

Дело в том, что все проще, когда среда просто соответствует POSIX. Или если вы установите минимальный MSYS и просто воспользуетесь им.

Идите по пути и активируйте эту команду.

/ s: Удаляет указанный каталог и все подкаталоги, включая любые файлы. Используйте / s, чтобы удалить дерево.

мне нужен способ рекурсивного удаления папки и ее дочерних элементов.

есть ли встроенный инструмент для этого, или мне нужно его написать?

DEL /S не удаляет каталоги.

DELTREE был удален из Windows 2000+

RMDIR или RD, если вы используете классическую командную строку (cmd.EXE-файл):

если вы используете PowerShell, вы можете использовать Remove-Item (который имеет псевдоним del , erase , rd , ri , rm и rmdir ) и занимает -Recurse аргумент, который может быть закорочен до -r

работает для всего, включая sys files

EDIT: я действительно нашел лучший способ, который также решает проблему слишком длинного пути к файлу:

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

/S удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. используется для удаления дерева каталогов.

/Q тихий режим, Не спрашивайте, если ok, чтобы удалить дерево каталогов с /S

вы можете установить cygwin, который имеет rm а также ls etc.

перейдите к пути и запустите эту команду.

/С : удаляет указанный каталог и все подкаталоги, включая любые файлы. Используйте /s для удаления дерева.

/ q: запускает rmdir в тихом режиме. Удаляет каталоги без подтверждения.

/? Отображает справку в командной строке.

rmdir /S /Q %DIRNAME%

для удаления каталога (независимо от того, существует он или нет) используйте следующее:

попробуйте эту команду:

rmdir / s dirname

вы можете установить GnuWin32 и использовать команды *nix изначально в windows. Я устанавливаю это, прежде чем устанавливать что-либо еще на мятную свежую копию windows. :)

вот что вам нужно сделать.

создайте пакетный файл со следующей строкой

сохраните пакетный файл как Remove.bat и положил его в C:\windows

создайте следующий раздел реестра

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

запуск regedit и измените значение по умолчанию HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default со следующим значением

вот оно! Теперь вы можете щелкнуть правой кнопкой мыши любой каталог и использовать RMDIR функция

во-первых, давайте рассмотрим, что rm -rf тут:

есть три сценария, где rm -rf обычно используется там, где ожидается возврат 0 :

  1. указанный путь не существует.
  2. указанный путь существует и является каталогом.
  3. указанный путь существует и является файлом.

я собираюсь игнорировать все разрешения, но никто не использует разрешения или не пытается отказать себе в любом случае, напишите доступ к вещам в Windows (хорошо, это должно быть шуткой. ).

первый set ERRORLEVEL для 0 а затем удалите путь, только если он существует, используя различные команды в зависимости от того, является ли это каталогом. IF EXIST не установлено ERRORLEVEL до 0, если путь не существует, поэтому установка ERRORLEVEL до 0 сначала необходимо правильно определить успех таким образом, чтобы имитировать нормальный rm -rf использование. Охрана RD С IF EXIST - это необходимо, потому что RD в отличие от rm -f , выдаст ошибку, если цель не существует.

следующий фрагмент сценария предполагает, что DELPATH является prequoted. (Это безопасно, когда вы делаете что-то вроде SET DELPATH=%1 . Попробуйте положить ECHO %1 на .cmd и передать ему аргумент с пробелами в нем и посмотреть,что произойдет для себя). После завершения фрагмента вы можете проверить наличие сбоя с помощью IF ERRORLEVEL 1 .

Точка, все проще, когда окружающая среда просто соответствует в POSIX. Или если вы установите минимальный MSYS и просто используете его.

вот что сработало для меня:

просто попробуйте уменьшить длину пути. Я. E:: переименуйте все папки, которые приводят к такому файлу, в наименьшие возможные имена. Произнесите имена из одной буквы. Продолжайте переименование вверх в иерархии папок. Этим u эффективно уменьшает длину пути. Теперь, наконец, попробуйте удалить файл сразу.

Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.

Для этого есть готовый инструмент или мне нужно написать его?

DEL/S не удаляет каталоги.

DELTREE был удален из Windows 2000+

Del / s (a) не работает вообще (он доступен только в некоторых версиях) или (b) покидает каталог верхнего уровня, но удаляет все под ним, или (c) оставляет все каталоги при удалении всех файлов? @ Аарон, ответ c, вам нужно использовать rmdir / s для удаления каталогов и файлов. Разве это не format c: тогда установка Linux? Я, конечно, шучу.

RMDIR или RD, если вы используете классическую командную строку (cmd.exe):

Если вы используете PowerShell, вы можете использовать Remove-Item (с псевдонимом del , erase , rd , ri , rm и rmdir ) и принимает аргумент -Recurse который может быть закорочен на -r

Стоит отметить, что для большого количества файлов rmdir / s / q обычно значительно быстрее, чем эквивалентная операция «select dir, shift + delete» в проводнике. Как насчет использования флагов для сопоставления имен каталогов? Если я хочу удалить все каталоги под foo \, rmdir /s /q foo\* выдает ошибку из-за неправильного синтаксиса. Это не удаляет файлы, как это делает rm -rf, а также возвращает ненулевое значение, когда каталог не существует, поэтому rd /s /q foo && echo "yay" завершится ошибкой, если каталог "foo" не не существует Что делать, реж. не пустые и некоторые файлы получают Access is denied и другие The process cannot access the file because it is being used by another process ? Я только что попробовал это в семь, и вам нужно сделать / S и / Q (заглавные буквы) Мистифицированный здесь. Я знаю, что пробовал эту команду, и она не работала, если в дереве каталогов были файлы; Теперь я возвращаюсь и. , , волшебно, кажется, работает. Кто-нибудь еще испытывает противоречивое поведение с этим ?! Да, я все время испытываю противоречивое поведение. Он говорит, что не может удалить каталог, потому что он заблокирован каким-то процессом. Но нет процессов, блокирующих каталог. Используйте, if exist myfolder ( rmdir /s/q myfolder ) если вы не знаете, будет ли папка существовать или нет Возможно, это сработало в некоторых старых окнах. Но сейчас это не работает вообще. help rmdir в windows 7 указывает, что /S следует использовать для удаления всего дерева каталогов, а /Q следует использовать в тихом режиме.

Работает для чего угодно, включая sys файлы

EDIT: я нашел лучший способ, который также решает проблему с файлом слишком долго:

Мой герой! И один совет: вы создаете пустую папку в C: \ empty, а затем, находясь внутри каждой сумасшедшей папки, можно просто сделать robocopy /mir c:\empty . takeown помог мне , как я скопировал папку из системы Linux с Rsync по ошибке , и я не имел никаких привилегий , чтобы удалить эту папку . Даже не Robocopy работал. Спасибо Очень хороший ответ. Оно работает. (все остальные ответы на странице нет). Но cacls не рекомендуется. Можно ли дать современный ответ, пожалуйста? Второй вариант уже работает и не устарел.

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

/S Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.

/Q Тихий режим, не спрашивайте, нормально ли удалять дерево каталогов с помощью /S

Спасибо за объяснение параметра. Принятый ответ не делает этого, к сожалению. Самый простой, идеальный ответ на вопрос. Должен быть принятым.

Вы можете установить cygwin, который имеет rm , а также ls и т.д.

Перейдите к пути и вызовите эту команду.

/s: Удаляет указанный каталог и все подкаталоги, включая любые файлы. Используйте /s для удаления дерева.

/q: Запуск rmdir в тихом режиме. Удаляет каталоги без подтверждения.

/?: Отображает справку в командной строке.

Для удаления каталога (независимо от того, существует он), используйте следующее:

rmdir /S /Q %DIRNAME%

Сначала рассмотрим, что делает rm -rf :

Существует три сценария, в которых rm -rf обычно используется там, где ожидается возврат 0 :

  • Указанный путь не существует.
  • Указанный путь существует и является каталогом.
  • Указанный путь существует и является файлом.

Я собираюсь игнорировать все права, но никто не использует разрешения или пытается запретить себе доступ на запись к вещам в Windows в любом случае (это значит, что это шутка. ).

Сначала установите ERRORLEVEL в 0, а затем удалите этот путь только в том случае, если он существует, используя разные команды в зависимости от того, является ли это каталогом. IF EXIST не устанавливает ERRORLEVEL в 0, если путь не существует, поэтому сначала нужно установить ERRORLEVEL в 0, чтобы правильно определить успех таким образом, который имитирует обычное использование rm -rf . Охрана RD с помощью IF EXIST необходима, потому что RD , в отличие от rm -f , выдает ошибку, если цель не существует.

Следующий фрагмент script предполагает, что DELPATH предзачитывается. (Это безопасно, когда вы делаете что-то вроде SET DELPATH=%1 . Постарайтесь положить ECHO %1 в .cmd и передать ему аргумент с пробелами в нем и посмотреть, что происходит для вас непосредственно). После завершения фрагмента вы можете проверить наличие ошибки с помощью IF ERRORLEVEL 1 .

Точка, все проще, когда среда просто соответствует POSIX. Или если вы установите минимальный MSYS и просто используйте это.

Читайте также: