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

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

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

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

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

27 ответов

Решение

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

rd /s /q "path"

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

rd -r "path"

Админ:

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

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

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

mkdir \empty
robocopy /mir \empty folder

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

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

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

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

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

rd /s /q "FOLDER_NAME"

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

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

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

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

rm -r -fo <path>

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

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

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

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

if exist myfolder ( rmdir /s/q myfolder )

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

yarn global add rimraf

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

rimraf .\**\node_modules

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

npx rimraf .\**\node_modules

Через Powershell

 Remove-Item -Recurse -Force "TestDirectory"

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

/questions/31342525/rm-rf-ekvivalent-dlya-windows/31342538#31342538

rmdir /S /Q %DIRNAME%

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

del /s foldername

rmdir /s dirname

in powershell, rm is alias of Remove-Item, so remove a file,

      rm -R -Fo the_file

is equivalent to

      Remove-Item -R -Fo the_file

if you feel comfortable with gnu util, you can the rm util by choco package manager on windows.

install gnu utils in powershell using choco:

      choco install GnuWin

finally,

      rm.exe -rf the_file

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

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

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

$ rm -rf ./path

в PowerShell

PS> rm -r -fo ./path

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

Примечание:

      Remove-Item ALIASE
    ri
    rm
    rmdir
    del
    erase
    rd

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

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

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.

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

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

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

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

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

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

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

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

rd -r -include *.* -force somedir

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

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

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

В PowerShell rm -recurse -force работает довольно хорошо.

Это приведет к удалению "моей папки" и ее содержимого без запроса:

rd /s /q "C:\Users\jerry.g\AppData\Roaming\my folder"

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

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

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

[HKEY_CLASSES_ROOT\ Папка \ оболочка \ rmdir \ command]
@="cmd.exe /s /c rmdir"%V""

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

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

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

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