"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
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
:
- Указанный путь не существует.
- Указанный путь существует и является каталогом.
- Указанный путь существует и является файлом.
Я собираюсь игнорировать всю проблему с разрешениями, но никто не использует разрешения и не пытается запретить себе доступ на запись в 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. Я устанавливаю это прежде, чем я установлю что-либо еще на мятную свежую копию окон.:)
Это приведет к удалению "моей папки" и ее содержимого без запроса:
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 - Удалить файлы