it-swarm-eu.dev

"rm -rf" ekvivalentní pro Windows?

Potřebuji způsob, jak rekurzivně smazat složku a její děti.

Existuje na to předpřipravený nástroj nebo musím nějaký napsat?

DEL /S neodstraňuje adresáře.

DELTREE byl odebrán ze systému Windows 2000+

429
FlySwat

RMDIR nebo RD, pokud používáte klasický příkazový řádek (cmd.exe):

rd /s /q "path"

Pokud používáte PowerShell, můžete použít Remove-Item (což je aliasy k del, erase, rd, ri, rm a rmdir) a vezme argument -Recurse, který lze zkratovat na -r

rd -r "path"
594
Duncan Smart

admin:

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

Funguje pro cokoli, včetně souborů sys

EDIT: Ve skutečnosti jsem našel nejlepší způsob, který také řeší cestu k souboru příliš dlouhý problém:

mkdir \empty
robocopy /mir \empty folder
128
wbkang

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

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

  • /S Odstraní všechny adresáře a soubory v zadaném adresáři kromě samotného adresáře. Slouží k odstranění stromu adresářů.

  • /Q Tichý režim, neptejte se, zda je v pořádku odstranit adresářový strom s /S

105
Jim McKeeth

Jděte na cestu a spusťte tento příkaz.

rd /s /q "FOLDER_NAME"

/ s: Odstraní určený adresář a všechny podadresáře včetně všech souborů. Pomocí/s odeberte strom.

/ q: Spustí rmdir v tichém režimu. Vymaže adresáře bez potvrzení.

/? : Zobrazí nápovědu k příkazu Prompt.

18

Můžete nainstalovat cygwin, který má rm a ls atd.

18
user17481

Pro smazání adresáře (ať už existuje nebo ne) použijte následující:

if exist myfolder ( rmdir /s/q myfolder )
6
Clay

rmdir /S /Q %DIRNAME%

5
Branan

rmdir/s dirname

3
Brian Mitchell

Zkuste tento příkaz:

del /s foldername
3
Jeremy Ruten

Nejprve se podívejme, co rm -rf dělá:

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

Existují tři scénáře, kde rm -rf se běžně používá tam, kde se očekává návrat 0:

  1. Zadaná cesta neexistuje.
  2. Zadaná cesta existuje a je adresářem.
  3. Zadaná cesta existuje a jedná se o soubor.

Budu ignorovat celou věc s oprávněními, ale nikdo nepoužívá oprávnění ani se nepokouší odepřít přístup k zápisu v systému Windows (OK, to znamená být vtip ...).

Nejprve nastavte ERRORLEVEL na a poté cestu smažte, pouze pokud existuje, pomocí různých příkazů v závislosti na tom, zda se jedná o adresář. IF EXIST nenastaví ERRORLEVEL na 0, pokud cesta neexistuje, takže nastavení ERRORLEVEL na 0 jako první je nutné pro správné zjištění úspěchu způsobem, který napodobuje běžné použití rm -rf. Hlídání RD pomocí IF EXIST je nutné, protože RD, na rozdíl od rm -f, vyvolá chybu, pokud cíl neexistuje.

Následující úryvek skriptu předpokládá, že DELPATH je předkódován. (Toto je bezpečné, když děláte něco jako SET DELPATH=%1. Zkuste vložit ECHO %1 do .cmd a předat jej argumentu s mezerami v něm a zjistit, co se stane pro sebe). Po dokončení fragmentu můžete zkontrolovat selhání pomocí 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%

Jde o to, že vše je jednodušší, když se prostředí pouze přizpůsobí POSIXu. Nebo pokud nainstalujete minimální MSYS a jednoduše to použijete.

3
binki

Zde je to, co musíte udělat ...

Vytvořte dávkový soubor s následujícím řádkem

RMDIR /S %1

Uložte dávkový soubor jako Remove.bat a vložte jej do C:\windows

Vytvořte následující klíč registru

HKEY_CLASSES_ROOT\Directory\Shell\Remove Directory (RMDIR)

Spusťte regedit a aktualizujte výchozí hodnotu HKEY_CLASSES_ROOT\Directory\Shell\Remove Directory (RMDIR)\default s následující hodnotou

"c:\windows\REMOVE.bat" "%1"

A je to! Nyní můžete pravým tlačítkem kliknout na libovolný adresář a použít funkci RMDIR

2
Louis

Můžete nainstalovat GnuWin32 a používat příkazy * nix nativně na Windows. Nainstaluji to dříve, než nainstaluji cokoli jiného na drobnou čerstvou kopii oken. :)

2
epochwolf

Přijatá odpověď je skvělá, ale za předpokladu, že máte nainstalován Node, můžete to udělat mnohem přesněji s knihovnou uzlů „rimraf“, která umožňuje vzory globbing. Používáte-li to hodně (já), stačí nainstalovat globálně.

yarn global add rimraf

pak například vzor, ​​který neustále používám:

rimraf .\**\node_modules

nebo pro jednostrannou linii, která vám umožní vyhnout se globální instalaci, ale pro dynamické stahování balíčku to trvá trochu déle:

npx rimraf .\**\node_modules
1
Artif3x

Používání Powershell 5.1

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

Nahraďte protokoly názvem adresáře, který chcete odstranit.

get-childitem hledá adresář pro děti se jménem rekurzivně z aktuální cesty (.).

remove-item odstraní výsledek.

1
n_y

POUŽÍVEJTE AT VAŠE VLASTNÍ RIZIKO. INFORMACE POSKYTOVANÉ „JAKO JE“. NEZKOUŠEJTE ROZŠÍŘENĚ.

Klepněte pravým tlačítkem myši na ikonu Windows (obvykle vlevo dole)> klikněte na „Windows PowerShell (Admin)“> použijte tento příkaz (pokud nebudete opatrní, můžete snadno odstranit všechny své soubory):

rd -r -include *.* -force somedir

Kde somedir je neprázdný adresář, který chcete odstranit.

U externích připojených disků nebo disků s problémy se systém Windows někdy chová lichě - nedochází k chybě při mazání (nebo při jakémkoli pokusu o kopírování), adresář se však podle pokynů neodstraní (nebo nekopíruje). (Zjistil jsem, že v tomto případě, přinejmenším pro mě, příkaz daný @n_y v jeho odpovědi způsobí chyby jako 'get-childitem: Soubor nebo adresář je poškozen a nečitelný.' Jako výsledek v PowerShell)

0
Roel

přes Powershell

 Remove-Item -Recurse -Force "TestDirectory"

přes příkazový řádek

https://stackoverflow.com/a/35731786/4391

0
cilerler

tady je to, co pro mě fungovalo:

Jen zkuste zkrátit délku cesty. tj. :: Přejmenovat všechny složky, které vedou k takovému souboru, na nejmenší možná jména. Řekněte jednopísmenová jména. Přejděte v hierarchii složek směrem nahoru. Tímto efektivně zkrátíte délku cesty. Nyní konečně zkuste soubor okamžitě odstranit.

0
Gaurav Deochakke