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

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

426 голосов
/ 19 сентября 2008

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

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

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

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

Ответы [ 18 ]

588 голосов
/ 19 сентября 2008

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

rd /s /q "path"

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

rd -r "path"
128 голосов
/ 19 сентября 2008

админ:

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

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

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

mkdir \empty
robocopy /mir \empty folder
105 голосов
/ 19 сентября 2008

RMDIR <strong>[/S]</strong> [/Q] [drive:]path

RD <strong>[/S]</strong> [/Q] [drive:]path

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

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

18 голосов
/ 19 сентября 2008

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

17 голосов
/ 01 марта 2016

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

rd /s /q "FOLDER_NAME"

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

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

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

6 голосов
/ 01 июня 2016

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

if exist myfolder ( rmdir /s/q myfolder )
5 голосов
/ 19 сентября 2008

rmdir /S /Q %DIRNAME%

3 голосов
/ 19 сентября 2008

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

del /s foldername
3 голосов
/ 21 апреля 2015

Во-первых, давайте рассмотрим, что делает 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 голосов
/ 19 сентября 2008

rmdir / s dirname

...