"Rm -rf" еквівалент для Windows?


508

Мені потрібен спосіб рекурсивного видалення папки та її дітей.

Чи є для цього попередньо вбудований інструмент чи мені потрібно його написати?

DEL /S не видаляє каталоги.

DELTREE було видалено з Windows 2000+


1
Чи не працює del / s (a) взагалі (він доступний лише в деяких версіях) або (b) залишає каталог верхнього рівня, але видаляє все, що знаходиться в ньому, або (c) залишає всі каталоги під час видалення всіх файлів?
wnoise

@Aaron, відповідь c, вам потрібно використовувати rmdir / s для видалення каталогів та файлів.
Клин

31
Хіба це не format c:реальна установка Linux? Я жартую, звичайно.
Базиль Старинкевич

Відповіді:


694

RMDIR або RD, якщо ви використовуєте класичний командний рядок (cmd.exe):

rd /s /q "path"

Шлях RMDIR [/ S] [/ Q] [drive:]

RD [/ S] [/ Q] [диск:] шлях

/ S Видаляє всі каталоги та файли у вказаному каталозі, крім самого каталогу. Використовується для видалення дерева директорій.

/ Q Тихий режим, не запитуйте, чи гаразд видаляти дерево каталогів за допомогою / S

Якщо ви використовуєте PowerShell можна використовувати Remove-Item(який є псевдонімом del, erase, rd, ri, rmі rmdir) і приймає -Recurseаргумент , який може бути замкнута в-r

rd -r "path"

84
Варто зазначити, що для великої кількості файлів rmdir / s / q, як правило, значно швидше, ніж еквівалент операції "select dir, shift + delete" в провіднику.
Клин

9
Це не видаляє файли, як це робить rm -rf, а також повертає ненульове значення, коли каталог не існує, тому rd /s /q foo && echo "yay"не вдасться, якщо каталог "foo" не існує.
Дірк Гроневельд

17
Що робити, якщо реж. не порожні, а деякі файли отримують Access is deniedта інші The process cannot access the file because it is being used by another process?
Євген

6
Я щойно спробував це в сім і вам потрібно зробити / S та / Q (cap)
префект ford

2
Тут містифікується. Я знаю, що я спробував цю команду, і вона не спрацювала, якщо в дереві каталогів були файли; тепер я повертаюсь назад і. . . магічно, здається, працює. Хтось ще відчуває непослідовну поведінку з цим ?!
Алекс Холл

139

адміністратор:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Працює для всього, включаючи файли sys

EDIT: Я фактично знайшов найкращий спосіб, який також вирішує занадто довгу проблему шляху до файлу:

mkdir \empty
robocopy /mir \empty folder

3
Мій герой! І одна порада: ви створюєте порожню папку в C: \ empty, потім потрапляючи всередину кожної божевільної папки, можна просто зробитиrobocopy /mir c:\empty .
Léon Pelletier

takeownДопоміг мені , як я скопіював папку з системи Linux з Rsync помилково , і я не мав ніяких привілеїв , щоб видалити цю папку ... Навіть не Robocopy працював. Спасибі
Jarda

1
Дуже приємна відповідь. Це працює. (всі інші відповіді на сторінці не відповідають). Але cacls застаріло. Чи можна зробити сучасну відповідь, будь ласка? Другий варіант вже працює і не застарілий.
Gangnus

Це нічого не робить для мене. Невже хтось може пояснити, як це має працювати? (роботокопія) - Це може видалити вміст папок, але не самі папки
Ральф

114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Видаляє всі каталоги та файли у вказаному каталозі, крім самого каталогу. Використовується для видалення дерева директорій.

  • /Q Спокійний режим, не запитуйте, чи гаразд видалити дерево каталогів /S


13
Дякуємо за пояснення параметра. Прийнята відповідь цього не робить, на жаль.
Томас

1
Найпростіша, досконала відповідь на питання. Повинен бути прийнятим.
Artif3x


19

Перейдіть на шлях і запустіть цю команду.

rd /s /q "FOLDER_NAME"

/ s: видаляє вказаний каталог та всі підкаталоги, включаючи будь-які файли. Використовуйте / s для видалення дерева.

/ q: Запускає rmdir в спокійному режимі. Видаляє каталоги без підтвердження.

/? : Відображає довідку в командному рядку.


9

Для видалення каталогу (існує чи ні) використовуйте наступне:

if exist myfolder ( rmdir /s/q myfolder )


6

Прийнята відповідь чудова, але якщо припустити, що у вас встановлений Node, ви можете зробити це набагато точніше за допомогою бібліотеки вузлів "rimraf", яка дозволяє використовувати шаблони глобалізації. Якщо ви цим користуєтеся багато (я це роблю), просто встановіть його в усьому світі.

yarn global add rimraf

то, наприклад, шаблон, яким я постійно користуюся:

rimraf .\**\node_modules

або для однолінійного лайнера, який дозволить вам уникнути глобальної установки, але для динамічного завантаження пакета потрібно трохи більше:

npx rimraf .\**\node_modules

2
Надійне рішення проблеми, оскільки воно є оперативним.
Деніалос

5

Спробуйте цю команду:

del /s foldername

працював для мене в поєднанні w / rmdir / s / q, оскільки деякі файли були заблоковані, і rmdir не вдався б до них. del / foldername занурив заблоковані файли, які потім дозволили rmdir позбутися root dir. Приємно.
bbqchickenrobot


4

Спочатку давайте розглянемо, що 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:

  1. Вказаного шляху не існує.
  2. Зазначений шлях існує і є каталогом.
  3. Зазначений шлях існує і є файлом.

Я буду ігнорувати весь дозвіл, але ніхто не використовує дозволи та не намагається заборонити собі доступ до речей у Windows все одно (гаразд, це означає, що це жарт ...).

Спочатку встановіть ERRORLEVELзначення 0, а потім видаліть шлях лише за наявності, використовуючи різні команди залежно від того, чи це каталог. IF EXISTне встановлюється ERRORLEVELна 0, якщо шлях не існує, тому встановлення значення ERRORLEVEL0 спочатку необхідно для належного виявлення успіху таким чином, що імітує нормальне 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 і просто використовуєте це.



3

Ось що вам потрібно зробити ...

Створіть пакетний файл із наступного рядка

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


3

Використання Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Замініть журнали на ім'я каталогу, яке ви хочете видалити.

get-childitem шукає довідник дітей з назвою рекурсивно з поточного шляху (.).

delete-item видаляє результат.


2

Ви можете встановити GnuWin32 та використовувати * nix команди спочатку у Windows. Я встановлюю це, перш ніж інсталювати щось інше на м'ятій свіжій копії вікон. :)


2

ВИКОРИСТОВУЙТЕ ВАШ ВЛАСНИЙ РИЗИК. ІНФОРМАЦІЯ, ЩО ПОДАЄТЬСЯ "ЯК Є" НЕ ТЕСТОВАНО ЕКСТРЕННО.

Клацніть правою кнопкою миші піктограму Windows (зазвичай внизу ліворуч)> натисніть "Windows PowerShell (Адміністратор)"> використовуйте цю команду (з належною обережністю ви можете легко видалити всі свої файли, якщо ви не обережні):

rd -r -include *.* -force somedir

Де somedirне порожній каталог, який потрібно видалити.

Зауважте, що із зовнішніми приєднаними дисками або дисками з проблемами Windows іноді поводиться дивно - він не помиляється при видаленні (або будь-якій спробі копіювання), але каталог не видаляється (або не копіюється) за інструкцією. (Я виявив, що в такому випадку, принаймні для мене, команда, надана @n_y у своїй відповіді, призведе до помилок на кшталт "get-childitem: файл або каталог пошкоджені та нечитабельні" в результаті в PowerShell)


1

ПОЗНАЧЕННЯ, АЛЕ ВАЖЛИВИЙ ВІДПОВІДЬ всім, у кого виникають проблеми з встановленням npm- пакетів на машині Windows, і якщо ви бачите помилку, сказати rm -rf...команду " " не знайдено. Ви можете використовувати bash cli для запуску команди rm у Windows.

для користувачів npm ви можете змінити конфігурацію npm npm config set script-shell "C:\Program Files\Git\bin\bash.exe"таким чином, якщо пакет npm, який ви намагаєтеся встановити, має сценарій post install, який використовує rm -rfкоманду, ви зможете запустити цю rmкоманду, не потребуючи нічого змінювати пакет npm або відключаючи конфігурація сценаріїв після установки. (Наприклад, styled-componentsвикористовує rmкоманду у своїх сценаріях після встановлення)

Якщо ви хочете просто використовувати rmкоманду, ви можете легко використовувати bash і передавати аргументи.

Так що так, ви можете використовувати команду 'rm' у Windows.


0

ось що для мене спрацювало:

Просто спробуйте зменшити довжину шляху. тобто: Перейменуйте всі папки, які призводять до такого файлу, до найменших можливих імен. Скажіть одну назву літер. Перейдіть на перейменування вгору в ієрархії папок. Цим і ефективно зменшити довжину шляху. Тепер нарешті спробуйте видалити файл відразу.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.