Эквивалент “rm -rf” для Windows?
Вопрос
Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.
Есть ли готовый инструмент для этого, или мне нужно его написать?
DEL /S
не удаляет каталоги.
DELTREE
был удален из Windows 2000+
Решение
RMDIR или удаленный сервер, если вы используете классическую командную строку (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
Работает для всего, включая системные файлы
Редактировать:Я действительно нашел лучший способ, который также решает проблему слишком длинного пути к файлу:
mkdir \empty
robocopy /mir \empty folder
RMDIR [/С] [/Q] [drive:]path
RD [/С] [/Q] [drive:]path
/S
Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов./Q
Тихий режим, не спрашивайте, можно ли удалить дерево каталогов с помощью/S
Вы можете установить cygwin, который имеет rm
а также ls
и т.д.
Перейдите к пути и запустите эту команду.
rd /s /q "FOLDER_NAME"
/с :Удаляет указанный каталог и все подкаталоги, включая любые файлы.Используйте /s для удаления дерева.
/q :Запускает rmdir в тихом режиме.Удаляет каталоги без подтверждения.
/?:Отображает справку в командной строке.
Для удаления каталога (независимо от того, существует он или нет) используйте следующее:
if exist myfolder ( rmdir /s/q myfolder )
rmdir /S /Q %DIRNAME%
имя файла rmdir /s
Попробуйте выполнить эту команду:
del /s foldername
Во-первых, давайте рассмотрим, что 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 и просто будете использовать его.
Вы можете установить GnuWin32 и используйте команды * nix изначально в Windows.Я устанавливаю это перед установкой чего-либо еще на мятную свежую копию Windows.:)
Вот что вам нужно сделать...
Создайте пакетный файл со следующей строкой
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-дочерний элемент выполняет поиск дочернего каталога с именем рекурсивно по текущему пути (.).
удалить-элемент удаляет результат.
Принятый ответ великолепен, но предполагая, что у вас установлен Node, вы можете сделать это гораздо точнее с помощью библиотеки узлов "rimraf", которая позволяет изменять шаблоны.Если вы часто используете это (я использую), просто установите его глобально.
yarn global add rimraf
тогда, например, шаблон, который я использую постоянно:
rimraf .\**\node_modules
или для однострочника, который позволяет вам избежать глобальной установки, но который занимает немного больше времени для динамической загрузки пакета:
npx rimraf .\**\node_modules
вот что сработало у меня:
Просто попробуйте уменьшить длину пути.т.е. ::Переименуйте все папки, которые ведут к такому файлу, в минимально возможные имена.Произнесите имена из одной буквы.Продолжайте переименовывать вверх по иерархии папок.Таким образом, вы эффективно уменьшаете длину пути.Теперь, наконец, попробуйте удалить файл сразу.
через Powershell
Remove-Item -Recurse -Force "TestDirectory"
через Командную строку
ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК.ИНФОРМАЦИЯ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ".НЕ ТЕСТИРОВАЛСЯ ШИРОКО.
Щелкните правой кнопкой мыши значок Windows (обычно внизу слева) > выберите "Windows PowerShell (администратор)" > используйте эту команду (при должной осторожности вы можете легко удалить все свои файлы, если не будете осторожны):
rd -r -include *.* -force somedir
Где somedir
это непустой каталог, который вы хотите удалить.
Обратите внимание, что с внешними подключенными дисками или дисками с проблемами Windows иногда ведет себя странно - она не выдает ошибку при удалении (или любой попытке копирования), однако каталог не удаляется (или не копируется) в соответствии с инструкциями.(Я обнаружил, что в этом случае, по крайней мере для меня, команда, данная @n_y в его ответе, приведет к ошибкам типа 'get-childitem :Файл или каталог поврежден и нечитаем". в результате в PowerShell)
Существует также deltree, если вы используете более старую версию Windows.
Мне очень нравится этот сайт для поиска команд:SS64:Del - Удалять файлы
каталог del /s /q удален