эквивалент" 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аргумент, который может быть сокращен до-rrd -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-удалить файлы