rm -rf эквивалент для Windows?

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

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

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

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


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


Ответы (23)


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

rd /s /q "path"

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

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

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

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

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

rd -r "path"
person Duncan Smart    schedule 18.09.2008
comment
Стоит отметить, что для большого количества файлов rmdir / s / q обычно значительно быстрее, чем эквивалентная операция select dir, shift + delete в проводнике. - person Wedge; 19.09.2008
comment
Как насчет использования флагов для сопоставления имен каталогов? Если я хочу удалить все каталоги в foo \, rmdir /s /q foo\* выдает ошибку из-за неправильного синтаксиса. - person Tom Mayfield; 08.06.2010
comment
Это не удаляет файлы, как это делает rm -rf, а также возвращает ненулевое значение, когда каталог не существует, поэтому rd /s /q foo && echo "yay" завершится ошибкой, если каталог foo не существует. - person Dirk Groeneveld; 31.03.2013
comment
@Derek, Doskey может помочь вам создать псевдонимы для ls = dir: devblog.point2.com/2010/05/14/ - person alexey; 30.09.2013
comment
Что, если реж. не пусто и одни файлы попадают Access is denied, а другие The process cannot access the file because it is being used by another process? - person Eugene; 13.01.2014
comment
Я как раз на семерке пробовал и нужно делать / S и / Q (заглавные буквы) - person ford prefect; 03.07.2014
comment
Мистифицировано здесь. Я знаю, что я пробовал эту команду, и она не работала, если в дереве каталогов были файлы; теперь возвращаюсь и. . . похоже, что это работает волшебным образом. Кто-нибудь еще испытывает непоследовательное поведение с этим ?! - person Alex Hall; 01.02.2016
comment
Да, я постоянно сталкиваюсь с непоследовательным поведением. Он говорит, что не может удалить каталог, потому что он заблокирован каким-то процессом. Но нет процессов, блокирующих каталог. - person Brain; 16.08.2016
comment
Используйте if exist myfolder ( rmdir /s/q myfolder ), если вы не знаете, будет ли папка существовать или нет. - person Clay; 12.04.2017
comment
Кажется, это не работает в PowerShell? Я получаю. Не найден позиционный параметр, который принимает аргумент '/ q'. - person Jon Gunter; 30.06.2017
comment
@JonGunter для Powershell вы используете командлет Remove-Item msdn.microsoft.com/en-us/powershell/reference/5.1/ - person Duncan Smart; 05.07.2017
comment
Возможно, это сработало в некоторых старых окнах. Но теперь это совсем не работает. - person Gangnus; 16.01.2018
comment
help rmdir в Windows 7 указывает, что /S следует использовать для удаления всего дерева каталогов, а /Q следует использовать для тихого режима. - person Matt Hancock; 03.07.2018
comment
Также стоит отметить, что высказывание rd -r вслух заставляет вас походить на пирата. - person David Jones; 13.07.2021

админ:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

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

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

mkdir \empty
robocopy /mir \empty folder
person wbkang    schedule 18.09.2008
comment
Мой герой! И один совет: вы создаете свою пустую папку в C: \ empty, а затем, оказавшись внутри каждой сумасшедшей папки, можно просто сделать robocopy /mir c:\empty . - person Léon Pelletier; 06.11.2015
comment
takeown помог мне, поскольку я по ошибке скопировал папку из системы Linux с помощью rsync, и у меня не было прав на удаление этой папки ... Даже robocopy не работал. Спасибо - person Jarda; 12.09.2016
comment
Очень хороший ответ. Оно работает. (все остальные ответы на странице - нет). Но cacls устарел. Можно ли дать современный ответ, пожалуйста? Второй вариант уже работает и не является устаревшим. - person Gangnus; 16.01.2018
comment
Это мне ничего не дает. Может кто-нибудь объяснить, как это должно работать? (robocopy) - может удалять содержимое папок, но не сами папки. - person Ralf; 02.05.2019
comment
@wbkang, когда я бегу cacls "C:\B" /c /G "ADMINNAME":F /T, я получаю No mapping between account names and security IDs was done. - person Bilal; 02.01.2021
comment
@bilal replaceadminname фактическим именем вашей учетной записи. - person wbkang; 02.01.2021
comment
@wbkang Для меня rmdir не работал, потому что у некоторых файлов были длинные пути, на самом деле ваше решение по копированию пустой папки в папку - разумное решение, спасибо - person Yerrapotu ManojKiran; 28.03.2021

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

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

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

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

person Jim McKeeth    schedule 18.09.2008
comment
Спасибо за объяснение параметров. Принятый ответ, к сожалению, этого не делает. - person Thomas; 20.01.2017
comment
Самый простой, идеальный ответ на вопрос. Должен быть принятым. - person Artif3x; 01.03.2019

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

rd /s /q "FOLDER_NAME"

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

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

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

person Sireesh Yarlagadda    schedule 01.03.2016

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

person user17481    schedule 18.09.2008

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

if exist myfolder ( rmdir /s/q myfolder )
person Clay    schedule 01.06.2016
comment
Собственно это и есть ответ. Спасибо @Clay - person George Pligoropoulos; 27.12.2020

через Powershell

 Remove-Item -Recurse -Force "TestDirectory"

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

https://stackoverflow.com/a/35731786/439130

person cilerler    schedule 19.12.2018

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

yarn global add rimraf

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

rimraf .\**\node_modules

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

npx rimraf .\**\node_modules
person Artif3x    schedule 01.03.2019
comment
Надежное решение проблемы, поскольку он не зависит от ОС. - person Denialos; 09.03.2019

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

del /s foldername
person Paige Ruten    schedule 18.09.2008
comment
работал у меня в сочетании с rmdir / s / q, поскольку некоторые файлы были заблокированы, и rmdir не работал с ними. del / foldername уничтожил заблокированные файлы, что позволило rmdir избавиться от корневого каталога. Отлично. - person bbqchickenrobot; 18.03.2014

rm -r -fo <path>

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

Remove-Item -Recurse -Force -Path <path>

(подробнее).

person stackprotector    schedule 04.09.2020
comment
БЛАГОДАРЮ ВАС! Это предложение действительно сработало в Терминале Windows. - person Nostalg.io; 31.03.2021

rmdir / s имя каталога

person Brian Mitchell    schedule 18.09.2008

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

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Существует три сценария, в которых обычно используется 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.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

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

person binki    schedule 21.04.2015

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

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

RMDIR /S %1

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

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

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

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

"c:\windows\REMOVE.bat" "%1"

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

person Louis    schedule 04.09.2012
comment
Это отличное начало, но командный файл не нужен: достаточно cmd.exe / s / c rmdir% V - person Ray Hulha; 22.07.2021

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

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

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

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

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

person NY-M    schedule 03.09.2018

ПОЗДНИЙ, НО ВАЖНЫЙ ОТВЕТ всем, у кого возникают проблемы с установкой пакетов 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.

person Abhishek    schedule 05.04.2020

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

person epochwolf    schedule 19.09.2008

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

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

rd -r -include *.* -force somedir

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

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

person Roel Van de Paar    schedule 12.06.2019

В PowerShell rm -recurse -force работает неплохо.

person faester    schedule 09.07.2021
comment
rm - это просто (один из множества del, erase, rd, ri, rm, rmdir) псевдонимов для remove-item, которые уже упоминались в ответах stackoverflow.com/a/63745519/7505395 и stackoverflow.com/a/53859156/7505395 и принятый ответ stackoverflow.com/a/97896/7505395 (в котором явно не говорится о применении силы, но все остальные делают) - person Patrick Artner; 09.07.2021
comment
Что ж, сила имеет значение. Я нашел другие ответы запутанными. - person faester; 14.07.2021

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

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

person Gaurav Deochakke    schedule 25.03.2015

В качестве побочного узла:

Из версии linux со всеми подкаталогами (рекурсивно) + принудительное удаление

$ rm -rf ./path

в PowerShell

PS> rm -r -fo ./path

который имеет примерно одинаковые параметры (только разделенные) (требуется -fo, поскольку -f может соответствовать другим другим параметрам)

Заметка:

Remove-Item ALIASE
    ri
    rm
    rmdir
    del
    erase
    rd
person BananaAcid    schedule 13.07.2021

Редактор реестра Windows версии 5.00

[HKEY_CLASSES_ROOT \ Folder \ shell \ rmdir \ command]
@ = cmd.exe / s / c rmdir% V

person Ray Hulha    schedule 22.07.2021

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

Подробнее об этом можно узнать здесь: SS64: DELTREE - удалить все вложенные папки и файлы.

person Jason Wadsworth    schedule 18.09.2008

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

person joe    schedule 30.12.2015
comment
Попробуйте добавить описание / объяснение. - person Rajen Raiyarela; 30.12.2015