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

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

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

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

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

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

wnoise 19.09.2008 06:59

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

Wedge 19.09.2008 14:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
549
2
684 151
21
Перейти к ответу Данный вопрос помечен как решенный

Ответы 21

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

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

del /s foldername

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

bbqchickenrobot 18.03.2014 20:36
Ответ принят как подходящий

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

rd /s /q "path"

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

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

/S Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.

/Q Quiet mode, do not ask if ok to remove a directory tree with /S

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

rd -r "path"

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

Wedge 19.09.2008 04:29

Как насчет использования флагов для сопоставления имен каталогов? Если я хочу удалить все каталоги в foo \, rmdir /s /q foo\* выдает ошибку из-за неправильного синтаксиса.

Tom Mayfield 08.06.2010 03:50

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

Dirk Groeneveld 31.03.2013 23:47

@Derek, Doskey может помочь вам создать псевдонимы для ls = dir: devblog.point2.com/2010/05/14/…

alexey 30.09.2013 20:59

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

Eugene 13.01.2014 13:00

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

ford prefect 03.07.2014 00:29

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

Alex Hall 01.02.2016 19:08

Да, я постоянно сталкиваюсь с непоследовательным поведением. Он говорит, что не может удалить каталог, потому что он заблокирован каким-то процессом. Но нет процессов, блокирующих каталог.

Brain 16.08.2016 15:36

Используйте if exist myfolder ( rmdir /s/q myfolder ), если вы не знаете, будет ли папка существовать или нет

Clay 12.04.2017 08:25

Кажется, это не работает в PowerShell? Я получаю «Не найден позиционный параметр, который принимает аргумент '/ q'».

Jon Gunter 30.06.2017 01:21

@JonGunter для Powershell вы используете командлет Remove-Item msdn.microsoft.com/en-us/powershell/reference/5.1/…

Duncan Smart 05.07.2017 13:45

Возможно, это сработало в некоторых старых окнах. Но теперь это совсем не работает.

Gangnus 16.01.2018 01:34

help rmdir в Windows 7 указывает, что /S следует использовать для удаления всего дерева каталогов, а /Q следует использовать для тихого режима.

Matt Hancock 03.07.2018 18:12

rmdir /S /Q %DIRNAME%

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

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

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

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

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

Thomas 20.01.2017 01:19

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

Artif3x 01.03.2019 18:02

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

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

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

админ:

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

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

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

mkdir \empty
robocopy /mir \empty folder

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

Léon Pelletier 06.11.2015 07:56

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

Jarda 12.09.2016 09:29

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

Gangnus 16.01.2018 01:31

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

Ralf 02.05.2019 10:05

@wbkang, когда я запускаю cacls "C:\B" /c /G "ADMINNAME":F /T, я получаю No mapping between account names and security IDs was done.

Bilal 02.01.2021 11:02

@bilal замените adminname на имя вашей учетной записи.

wbkang 02.01.2021 19:55

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

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

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

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.

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

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

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

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

Попробуйте добавить описание / объяснение.

Rajen Raiyarela 30.12.2015 14:01

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

rd /s /q "FOLDER_NAME"

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

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

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

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

if exist myfolder ( rmdir /s/q myfolder )

Собственно это и есть ответ. Спасибо @Clay

George Pligoropoulos 27.12.2020 18:52

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

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

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

Get-childitem ищет дочерний каталог с именем рекурсивно из текущего пути (.).

Убрать предмет удаляет результат.

через Powershell

 Remove-Item -Recurse -Force "TestDirectory"

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

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

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

yarn global add rimraf

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

rimraf .\**\node_modules

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

npx rimraf .\**\node_modules

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

Denialos 09.03.2019 11:16

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

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

rd -r -include *.* -force somedir

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

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

ПОЗДНИЙ, НО ВАЖНЫЙ ОТВЕТ всем, у кого возникают проблемы с установкой пакетов npm на компьютере с Windows, и если вы видите ошибку с сообщением «rm -rf...», команда не найдена. Вы можете использовать Баш Кли для запуска команды 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.

rm -r -fo <path>

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

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

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

Другие вопросы по теме