Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.
Есть ли для этого готовый инструмент или мне нужно его написать?
DEL /S
не удаляет каталоги.
DELTREE
был удален из Windows 2000+
Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.
Есть ли для этого готовый инструмент или мне нужно его написать?
DEL /S
не удаляет каталоги.
DELTREE
был удален из Windows 2000+
RMDIR или RD, если вы используете классическую командную строку (cmd.exe):
rd /s /q "path"
RMDIR [/ S] [/ Q] [диск:] путь
RD [/ S] [/ Q] [диск:] путь
/ S Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.
/ Q Тихий режим, не спрашивать, можно ли удалить дерево каталогов с помощью / S
Если вы используете PowerShell, вы можете использовать Remove-Item
(который имеет псевдонимы del
, erase
, rd
, ri
, rm
и rmdir
) и принимает аргумент -Recurse
, который может быть сокращен до -r
rd -r "path"
rmdir /s /q foo\*
выдает ошибку из-за неправильного синтаксиса.
- person Tom Mayfield; 08.06.2010
rd /s /q foo && echo "yay"
завершится ошибкой, если каталог foo не существует.
- person Dirk Groeneveld; 31.03.2013
Access is denied
, а другие The process cannot access the file because it is being used by another process
?
- person Eugene; 13.01.2014
if exist myfolder ( rmdir /s/q myfolder )
, если вы не знаете, будет ли папка существовать или нет.
- person Clay; 12.04.2017
help rmdir
в Windows 7 указывает, что /S
следует использовать для удаления всего дерева каталогов, а /Q
следует использовать для тихого режима.
- person Matt Hancock; 03.07.2018
rd -r
вслух заставляет вас походить на пирата.
- person David Jones; 13.07.2021
админ:
takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder
Работает со всем, включая файлы sys
РЕДАКТИРОВАТЬ: Я действительно нашел лучший способ, который также решает проблему слишком длинного пути к файлу:
mkdir \empty
robocopy /mir \empty folder
robocopy /mir c:\empty .
- person Léon Pelletier; 06.11.2015
takeown
помог мне, поскольку я по ошибке скопировал папку из системы Linux с помощью rsync, и у меня не было прав на удаление этой папки ... Даже robocopy не работал. Спасибо
- person Jarda; 12.09.2016
cacls "C:\B" /c /G "ADMINNAME":F /T
, я получаю No mapping between account names and security IDs was done.
- person Bilal; 02.01.2021
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
и т. Д.
Для удаления каталога (независимо от того, существует он или нет) используйте следующее:
if exist myfolder ( rmdir /s/q myfolder )
через 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
Попробуйте эту команду:
del /s foldername
rm -r -fo <path>
является наиболее близким из возможных в Windows PowerShell. Это сокращение от
Remove-Item -Recurse -Force -Path <path>
rmdir / s имя каталога
Во-первых, давайте посмотрим, что делает 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 и просто воспользуетесь им.
Вот что вам нужно сделать ...
Создайте командный файл со следующей строкой
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.
Использование Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Замените журналы именем каталога, который вы хотите удалить.
get-childitem выполняет поиск дочернего каталога с именем рекурсивно по текущему пути (.).
remove-item удаляет результат.
ПОЗДНИЙ, НО ВАЖНЫЙ ОТВЕТ всем, у кого возникают проблемы с установкой пакетов 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.
Вы можете установить GnuWin32 и использовать команды * nix изначально в Windows. Я устанавливаю это перед установкой чего-либо еще на свежей копии Windows. :)
ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК. ИНФОРМАЦИЯ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ». ДОПОЛНИТЕЛЬНО НЕ ПРОВЕРЕНЫ.
Щелкните правой кнопкой мыши значок Windows (обычно внизу слева)> щелкните «Windows PowerShell (Admin)»> используйте эту команду (при должной осторожности вы можете легко удалить все свои файлы, если не будете осторожны):
rd -r -include *.* -force somedir
Где somedir
- это непустой каталог, который вы хотите удалить.
Обратите внимание, что с внешними подключенными дисками или дисками с проблемами Windows иногда ведет себя странно - это не ошибка при удалении (или любой попытке копирования), но каталог не удаляется (или не копируется) в соответствии с инструкциями. (Я обнаружил, что в этом случае, по крайней мере, для меня, команда, заданная @n_y в его ответе, вызовет такие ошибки, как «get-childitem: файл или каталог поврежден и нечитаем». В результате в PowerShell)
В PowerShell rm -recurse -force
работает неплохо.
rm
- это просто (один из множества del, erase, rd, ri, rm, rmdir
) псевдонимов для remove-item
, которые уже упоминались в ответах stackoverflow.com/a/63745519/7505395 и stackoverflow.com/a/53859156/7505395 и принятый ответ stackoverflow.com/a/97896/7505395 (в котором явно не говорится о применении силы, но все остальные делают)
- person Patrick Artner; 09.07.2021
вот что сработало для меня:
Просто попробуйте уменьшить длину пути. ie :: Переименуйте все папки, которые ведут к такому файлу, на наименьшие возможные имена. Произнесите имена из одной буквы. Продолжайте переименовывать вверх по иерархии папок. Благодаря этому вы эффективно уменьшите длину пути. Теперь, наконец, попробуйте сразу же удалить файл.
В качестве побочного узла:
Из версии linux со всеми подкаталогами (рекурсивно) + принудительное удаление
$ rm -rf ./path
в PowerShell
PS> rm -r -fo ./path
который имеет примерно одинаковые параметры (только разделенные) (требуется -fo, поскольку -f может соответствовать другим другим параметрам)
Заметка:
Remove-Item ALIASE
ri
rm
rmdir
del
erase
rd
Редактор реестра Windows версии 5.00
[HKEY_CLASSES_ROOT \ Folder \ shell \ rmdir \ command]
@ = cmd.exe / s / c rmdir% V
Существует также deltree, если вы используете более старую версию Windows.
Подробнее об этом можно узнать здесь: SS64: DELTREE - удалить все вложенные папки и файлы.
каталог del / s / q удален