эквивалент" rm-rf " для Windows?
мне нужен способ, чтобы рекурсивно удалить папку и ее детей.
есть ли готовый инструмент для этого, или мне нужно написать одну?
DEL /S
не удаляет каталоги.
DELTREE
был удален из Windows 2000+
18 ответов:
RMDIR или RD, если вы используете классическую командную строку (cmd.exe):
rd /s /q "path"
если вы используете PowerShell, вы можете использовать
Remove-Item
(который имеет псевдонимdel
,erase
,rd
,ri
,rm
иrmdir
) и занимает-Recurse
аргумент, который может быть сокращен до-r
rd -r "path"
admin:
takeown /r /f folder cacls folder /c /G "ADMINNAME":F /T rmdir /s folder
работает для всего, включая файлы sys
EDIT: я на самом деле нашел лучший способ, который также решает проблему слишком длинного пути к файлу:
mkdir \empty robocopy /mir \empty folder
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S
удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. используется для удаления дерева каталогов.
/Q
тихий режим, Не спрашивайте, если ok, чтобы удалить дерево каталогов с/S
перейдите к пути и запустите эту команду.
rd /s /q "FOLDER_NAME"
/С : удаляет указанный каталог и все подкаталоги, включая любые файлы. Используйте /s для удаления дерева.
/ q: запускает rmdir в тихом режиме. Удаляет каталоги без подтверждения.
/? Отображает справку в командной строке.
для удаления каталога (независимо от того, существует он или нет) используйте следующее:
if exist myfolder ( rmdir /s/q myfolder )
вы можете установить 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 функция
во-первых, давайте рассмотрим, что
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 в любом случае (ладно, это шутка...).
первый set
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 и просто используете его.
вот что сработало для меня:
просто попробуйте уменьшить длину пути. т. е. :: переименуйте все папки, которые ведут к такому файлу, в наименьшие возможные имена. Произнесите имена из одной буквы. Продолжайте переименование вверх в иерархии папок. Благодаря этому u эффективно уменьшает длину пути. Теперь, наконец, попробуйте удалить файл сразу.
это приведет к удалению "моя папка" и ее содержимое без приглашения:
rd /s /q "C:\Users\jerry.g\AppData\Roaming\my folder"
Использование Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
заменить журналы С именем каталога, который вы хотите удалить.
get-childitem поиск дочернего каталога с именем рекурсивно из текущего пути (.).
remove-item удаляет результат.
есть также deltree, если вы находитесь на более старой версии windows.
Мне очень нравится этот сайт для поиска команды: SS64: Del-удалить файлы