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

389

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

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

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

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

  • 1
    Del / s (a) не работает вообще (он доступен только в некоторых версиях) или (b) покидает каталог верхнего уровня, но удаляет все под ним, или (c) оставляет все каталоги при удалении всех файлов?
  • 0
    @ Аарон, ответ c, вам нужно использовать rmdir / s для удаления каталогов и файлов.
Показать ещё 1 комментарий
Теги:
cmd
wsh

18 ответов

554
Лучший ответ

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

rd /s /q "path"

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

rd -r "path"
  • 75
    Стоит отметить, что для большого количества файлов rmdir / s / q обычно значительно быстрее, чем эквивалентная операция «select dir, shift + delete» в проводнике.
  • 1
    Как насчет использования флагов для сопоставления имен каталогов? Если я хочу удалить все каталоги под foo \, rmdir /s /q foo\* выдает ошибку из-за неправильного синтаксиса.
Показать ещё 11 комментариев
127

админ:

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

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

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

mkdir \empty
robocopy /mir \empty folder
  • 2
    Мой герой! И один совет: вы создаете пустую папку в C: \ empty, а затем, находясь внутри каждой сумасшедшей папки, можно просто сделать robocopy /mir c:\empty .
  • 0
    takeown помог мне , как я скопировал папку из системы Linux с Rsync по ошибке , и я не имел никаких привилегий , чтобы удалить эту папку ... Даже не Robocopy работал. Спасибо
Показать ещё 1 комментарий
87

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

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

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

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

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

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

14

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

rd /s /q "FOLDER_NAME"

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

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

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

6

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

if exist myfolder ( rmdir /s/q myfolder )
5

rmdir /S /Q %DIRNAME%

3

Сначала рассмотрим, что делает 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:

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

Я собираюсь игнорировать все права, но никто не использует разрешения или пытается запретить себе доступ на запись к вещам в 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.

: # 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

Попробуйте выполнить следующую команду:

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

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

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

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

2

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

2

rmdir/s dirname

0

через Powershell

 Remove-Item -Recurse -Force "TestDirectory"

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

https://stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows

0

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

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

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

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

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

0

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

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

0
-2

del/s/q directorytobedeleted

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

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

Мне очень нравится этот сайт для поиска команд: SS64: Del - Удалить файлы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню