«Rm -rf» эквивалент для Windows?


509

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

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

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

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


1
Разве del / s (a) не работает вообще (он доступен только в некоторых версиях) или (b) покидает каталог верхнего уровня, но удаляет все под ним, или (c) оставляет все каталоги при удалении всех файлов?
wnoise

@ Аарон, ответ c, вам нужно использовать rmdir / s для удаления каталогов и файлов.
Клин

31
Не правда ли, format c:тогда установка Linux? Я, конечно, шучу.
Василий Старынкевич

Ответы:


694

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"

84
Стоит отметить, что для большого количества файлов rmdir / s / q обычно значительно быстрее, чем эквивалентная операция «select dir, shift + delete» в проводнике.
Клин

9
Это не удаляет файлы, как это делает rm -rf, а также возвращает ненулевое значение, когда каталог не существует, поэтому rd /s /q foo && echo "yay"произойдет сбой, если каталог "foo" не существует.
Дирк Греневельд

17
Что делать, реж. не пустые и одни файлы попадают, Access is deniedа другие The process cannot access the file because it is being used by another process?
Евгений

6
Я только что попробовал это в семь, и вам нужно сделать / S и / Q (заглавные буквы)
Форд префект

2
Мистифицированный здесь. Я знаю, что пробовал эту команду, и она не работала, если в дереве каталогов были файлы; Теперь я возвращаюсь и. , , волшебно, кажется, работает. Кто-нибудь еще испытывает противоречивое поведение с этим ?!
Алекс Холл

139

админ:

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

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

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

mkdir \empty
robocopy /mir \empty folder

3
Мой герой! И один совет: вы создаете пустую папку в C: \ empty, а затем один раз внутри каждой сумасшедшей папки, это можно просто сделатьrobocopy /mir c:\empty .
Леон Пеллетье

Это takeownпомогло мне, когда я по ошибке скопировал папку из системы Linux с помощью rsync, и у меня не было прав на удаление этой папки ... Даже робокопия не сработала. Спасибо
Ярда

1
Очень хороший ответ. Оно работает. (все остальные ответы на странице нет). Но cacls не рекомендуется. Можно ли дать современный ответ, пожалуйста? Второй вариант уже работает и не устарел.
Гангнус

Это ничего не делает для меня. Может кто-нибудь объяснить, как это должно работать? (robocopy) - Он может удалять содержимое папок, но не сами папки
Ralf

114

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

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

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

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


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

1
Самый простой, идеальный ответ на вопрос. Должен быть принятым.
Artif3x


19

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

rd /s /q "FOLDER_NAME"

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

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

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


9

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

if exist myfolder ( rmdir /s/q myfolder )


6

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

yarn global add rimraf

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

rimraf .\**\node_modules

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

npx rimraf .\**\node_modules

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

5

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

del /s foldername

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


4

Сначала давайте рассмотрим, что 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 и просто используете его.



3

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

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

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


3

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

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

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

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

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


2

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


2

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

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

rd -r -include *.* -force somedir

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

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


1

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


0

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

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.