Odpowiednik „rm -rf” dla systemu Windows?


508

Potrzebuję sposobu na rekurencyjne usunięcie folderu i jego dzieci.

Czy istnieje gotowe narzędzie do tego, czy muszę je napisać?

DEL /S nie usuwa katalogów.

DELTREE został usunięty z systemu Windows 2000+


1
Czy del / s (a) w ogóle nie działa (jest dostępne tylko w niektórych wersjach) lub (b) opuszcza katalog najwyższego poziomu, ale usuwa wszystko pod nim lub (c) opuszcza wszystkie katalogi podczas usuwania wszystkich plików?
wnoise,

@Aaron, odpowiedź c, musisz użyć rmdir / s, aby usunąć katalogi i pliki.
Wedge

31
Czy tak naprawdę nie jest format c:to instalacja Linuksa? Oczywiście żartuję.
Basile Starynkevitch,

Odpowiedzi:


694

RMDIR lub RD, jeśli używasz klasycznego wiersza polecenia (cmd.exe):

rd /s /q "path"

RMDIR [/ S] [/ Q] [dysk:] ścieżka

Ścieżka RD [/ S] [/ Q] [drive:]

/ S Usuwa wszystkie katalogi i pliki z określonego katalogu oprócz samego katalogu. Służy do usuwania drzewa katalogów.

/ Q Tryb cichy, nie pytaj, czy możesz usunąć drzewo katalogów za pomocą / S

Jeśli używasz PowerShell można użyć Remove-Item(co jest aliasem del, erase, rd, ri, rmi rmdir) i ma -Recurseargumenty, które mogą być zwarte do-r

rd -r "path"

84
Warto zauważyć, że w przypadku dużej liczby plików rmdir / s / q jest zwykle znacznie szybszy niż równoważna operacja „select dir, shift + delete” w Eksploratorze.
Wedge

9
Nie usuwa plików, podobnie jak rm -rf, a także zwraca wartość niezerową, gdy katalog nie istnieje, więc rd /s /q foo && echo "yay"zawiedzie, jeśli katalog „foo” nie istnieje.
Dirk Groeneveld

17
Co jeśli reż. nie są puste, a niektóre pliki się pojawiają, Access is denieda inne The process cannot access the file because it is being used by another process?
Eugene

6
Właśnie próbowałem tego w siódmym i musisz zrobić / S i / Q (czapki)
ford prefect

2
Z tajemnicy tutaj. Ja wiem, że próbowałem tego polecenia i to nie działa, jeśli nie były plików w drzewie katalogów; teraz wracam i. . . magicznie wydaje się, że działa. Czy ktoś jeszcze ma z tym niespójne zachowanie ?!
Alex Hall

139

Admin:

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

Działa na wszystko, w tym pliki sys

EDYCJA: Właściwie znalazłem najlepszy sposób, który rozwiązuje również problem zbyt długiej ścieżki pliku:

mkdir \empty
robocopy /mir \empty folder

3
Mój bohater! I jedna wskazówka: tworzysz swój pusty folder w C: \ pusty, a potem w każdym zwariowanym folderze możesz po prostu zrobićrobocopy /mir c:\empty .
Léon Pelletier

takeownPomógł mi jak skopiowałem folder z systemem Linux z rsync przez pomyłkę i nie miałem żadnych uprawnień, aby usunąć ten folder ... Nawet robocopy pracował. Dzięki
Jarda

1
Bardzo miła odpowiedź. To działa. (wszystkie inne odpowiedzi na stronie nie). Ale cacls jest przestarzałe. Czy można udzielić współczesnej odpowiedzi? Drugi wariant już działa i nie jest przestarzały.
Gangnus

To nic dla mnie nie robi. Czy ktoś mógłby wyjaśnić, jak to ma działać? (robocopy) - Może usuwać zawartość folderów, ale nie samych folderów
Ralf

114

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

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

  • /S Usuwa wszystkie katalogi i pliki z określonego katalogu oprócz samego katalogu. Służy do usuwania drzewa katalogów.

  • /Q Tryb cichy, nie pytaj, czy możesz usunąć drzewo katalogów za pomocą /S


13
Dzięki za wyjaśnienie parametru. Zaakceptowana odpowiedź tego nie robi, niestety.
Thomas

1
Najprostsza, idealna odpowiedź na pytanie. Powinien być zaakceptowany.
Artif3x


19

Przejdź do ścieżki i uruchom to polecenie.

rd /s /q "FOLDER_NAME"

/ s: usuwa określony katalog i wszystkie podkatalogi, w tym wszelkie pliki. Użyj / s, aby usunąć drzewo.

/ q: Uruchamia rmdir w trybie cichym. Usuwa katalogi bez potwierdzenia.

/? : Wyświetla pomoc w wierszu polecenia.


9

Aby usunąć katalog (niezależnie od tego, czy istnieje), skorzystaj z następujących opcji:

if exist myfolder ( rmdir /s/q myfolder )


6

Przyjęta odpowiedź jest świetna, ale zakładając, że masz zainstalowany Węzeł, możesz to zrobić o wiele bardziej precyzyjnie z biblioteką węzłów „rimraf”, która pozwala na wzorce globowania. Jeśli często z tego korzystasz (ja to robię), po prostu zainstaluj go globalnie.

yarn global add rimraf

następnie, na przykład, wzór, którego używam stale:

rimraf .\**\node_modules

lub w przypadku jednej linijki, która pozwala uniknąć globalnej instalacji, ale która trwa nieco dłużej w przypadku dynamicznego pobierania pakietu:

npx rimraf .\**\node_modules

2
Solidne rozwiązanie problemu, ponieważ jest niezależny od systemu operacyjnego.
Denialos

5

Wypróbuj to polecenie:

del /s foldername

pracował dla mnie w połączeniu z / rmdir / s / q, ponieważ niektóre pliki były zablokowane i rmdir na nich nie działał. del / foldername nukował zablokowane pliki, co pozwoliło rmdir pozbyć się katalogu root. Miły.
bbqchickenrobot


4

Najpierw przejrzyjmy, co 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

Istnieją trzy scenariusze, w których rm -rfpowszechnie stosuje się tam, gdzie oczekuje się powrotu 0:

  1. Podana ścieżka nie istnieje.
  2. Podana ścieżka istnieje i jest katalogiem.
  3. Podana ścieżka istnieje i jest plikiem.

Zamierzam zignorować całą kwestię uprawnień, ale nikt nie używa uprawnień ani nie próbuje odmówić sobie dostępu do zapisu w Windowsie (OK, to ma być żart…).

Najpierw ustaw ERRORLEVELna 0, a następnie usuń ścieżkę tylko wtedy, gdy istnieje, używając różnych poleceń w zależności od tego, czy jest to katalog. IF EXISTnie ustawia wartości ERRORLEVEL0, jeśli ścieżka nie istnieje, więc ustawienie wartości ERRORLEVEL0 jako pierwsze jest konieczne do prawidłowego wykrycia sukcesu w sposób naśladujący normalne rm -rfużycie. Ochrona za RDpomocą IF EXISTjest konieczna, ponieważ RDw przeciwieństwie dorm -f spowoduje błąd, jeśli cel nie istnieje.

Poniższy fragment skryptu zakłada, że ​​DELPATH jest wstępnie cytowany. (Jest to bezpieczne, gdy zrobisz coś podobnego SET DELPATH=%1. Spróbuj umieścić ECHO %1w sposób .cmdi przekazując jej argument ze spacjami w nim i zobaczyć, co dzieje się na siebie). Po zakończeniu fragmentu kodu możesz sprawdzić, czy wystąpił błąd 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%

Chodzi o to, że wszystko jest prostsze, gdy środowisko jest zgodne z POSIX. Lub jeśli zainstalujesz minimalny MSYS i po prostu go użyjesz.



3

Oto, co musisz zrobić ...

Utwórz plik wsadowy z następującym wierszem

RMDIR /S %1

Zapisz plik wsadowy jako Remove.bati włóż goC:\windows

Utwórz następujący klucz rejestru

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Uruchom regediti zaktualizuj wartość domyślną HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default o następującą wartość

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

Otóż ​​to! Teraz możesz kliknąć prawym przyciskiem myszy dowolny katalog i użyć funkcji RMDIR


3

Korzystanie z programu PowerShell 5.1

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

Zamień dzienniki na nazwę katalogu, który chcesz usunąć.

get-childitem szuka katalogu dzieci o nazwie rekurencyjnie od bieżącej ścieżki (.).

remove-item usuwa wynik.


2

Możesz zainstalować GnuWin32 i używać poleceń * nix natywnie w systemie Windows. Instaluję to, zanim zainstaluję cokolwiek innego na drobnej świeżej kopii systemu Windows. :)


2

UŻYWAJ NA WŁASNE RYZYKO. INFORMACJE PRZEKAZANE „W STANIE, W JAKIM SIĘ ZNAJDUJĄ”. NIE PRZETESTOWANY W ROZSZERZENIU.

Kliknij prawym przyciskiem myszy ikonę Windows (zwykle u dołu po lewej)> kliknij „Windows PowerShell (Administrator)”> użyj tego polecenia (z należytą ostrożnością możesz łatwo usunąć wszystkie pliki, jeśli nie jesteś ostrożny):

rd -r -include *.* -force somedir

Gdzie somedir jest niepusty katalog, który chcesz usunąć.

Należy pamiętać, że w przypadku zewnętrznych dysków podłączonych lub dysków z problemami system Windows czasami zachowuje się dziwnie - nie powoduje błędu podczas usuwania (ani żadnej próby kopiowania), ale katalog nie jest usuwany (ani kopiowany) zgodnie z instrukcją. (Odkryłem, że w tym przypadku, przynajmniej dla mnie, polecenie wydane przez @n_y w jego odpowiedzi spowoduje błędy takie jak „get-childitem: plik lub katalog jest uszkodzony i nieczytelny.” W wyniku tego w programie PowerShell)


1

PÓŹNIEJ, ALE WAŻNA ODPOWIEDŹ dla każdego, kto ma problemy z instalacją pakietów npm na komputerze z systemem Windows i jeśli widzisz błąd z komunikatem „ rm -rf...” nie znaleziono polecenia. Możesz użyć bash cli, aby uruchomić polecenie rm w systemie Windows.

dla użytkowników npm, możesz zmienić konfigurację npm w npm config set script-shell "C:\Program Files\Git\bin\bash.exe"ten sposób, jeśli pakiet npm, który próbujesz zainstalować, ma skrypt poinstalacyjny, który używa rm -rfpolecenia, będziesz mógł uruchomić to rmpolecenie bez potrzeby zmiany czegokolwiek w pakiecie npm lub wyłączenia konfiguracja skryptów po instalacji. (Na przykład styled-componentsużywa rmpolecenia w swoich skryptach poinstalacyjnych)

Jeśli chcesz po prostu użyć rmpolecenia, możesz łatwo użyć bash i przekazać argumenty.

Tak, możesz użyć polecenia „rm” w systemie Windows.


0

oto co dla mnie zadziałało:

Po prostu spróbuj zmniejszyć długość ścieżki. ie :: Zmień nazwy wszystkich folderów, które prowadzą do takiego pliku, na możliwie najmniejsze nazwy. Powiedz nazwy jednej litery. Zmień nazwę w górę w hierarchii folderów. W ten sposób skutecznie skracasz długość ścieżki. Teraz wreszcie spróbuj od razu usunąć plik.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.