Masowe usuwanie plików w systemie Windows

141

Mam katalog, który zawiera ~ 3 miliony plików w niektórych podkatalogach na serwerze z systemem Windows 2008. Ręczne usuwanie plików za pomocą SHIFT + DEL w katalogu głównym trwa wieki. Czy istnieje inny sposób na szybsze usunięcie ?

Cfinley
źródło
1
Zapytany również tutaj na Stack Overflow: stackoverflow.com/questions/186737/…
Hugo
6
Jak mogę skierować magnes tylko na niektóre podkatalogi?
Jaime Hablutzel
7
@Jaime Pewną ręką, jak prawdziwy programista ... ;-) xkcd.com/378
Legionair
Co jeśli jest to dysk SSD?
Benjamin Weiss,
Odpowiedź na powershell: stackoverflow.com/questions/1752677/…
Warlike Chimpanzee

Odpowiedzi:

179

OSTRZEŻENIE: jeśli masz dowiązania symboliczne do katalogów del, usuniesz rzeczywiste katalogi, a nie dowiązania symboliczne. Bądź bardzo ostrożny i nie uruchamiaj tych poleceń, chyba że wiesz, że w katalogu docelowym nie ma dowiązań symbolicznych.


Regularnie muszę usuwać wiele plików i katalogów z zaszyfrowanego dysku WinXP, zwykle około 22 GB z 500 000 plików w 45 000 folderów.

Usuwanie za pomocą Eksploratora Windows jest marnotrawstwem, ponieważ marnuje dużo czasu na wyliczanie plików. Zwykle przenoszę rzeczy, które muszę usunąć, do C: \ stufftodelete i mam plik wsadowy deletestuff.bat rmdir /s/q C:\stufftodelete. To ma działać w nocy, ale czasami muszę go uruchomić w ciągu dnia, więc im szybciej, tym lepiej.

Oto wyniki szybkiego testu małej próbki 5,85 MB z 960 plików w 303 folderach. Uruchomiłem metodę 1, a następnie metodę 2, a następnie zresetowałem katalogi testowe.

Metoda 1 usuwa pliki i strukturę katalogów w jednym przebiegu:

rmdir /s/q foldername

Metoda 2 ma pierwszy przebieg, aby usunąć pliki i dane wyjściowe do wartości nul, aby uniknąć narzutu pisania na ekranie dla każdego pojedynczego pliku. Drugie przejście następnie usuwa pozostałą strukturę katalogów:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Metoda 1: 17,5 s, 14,9 s, 13,9 s, 14,8 s, 13,8 s: średnio 14,98 sekundy
  • Metoda 2: 14,3 s, 12,1 s, 11,7 s, 14,2 s, 11,8 s: średnio 12,82 sekundy

Oto wyniki kolejnego testu z wykorzystaniem 404 MB z 19 521 plików w 3224 folderach:

  • Metoda 1: 2 minuty 20 sekund
  • Metoda 2: 2 minuty 33 sekundy

Więc nie ma w tym wiele, prawdopodobnie zbyt blisko, aby ocenić na jednym teście.


Edycja: Przetestowałem znacznie więcej danych, jest to dla mnie typowy przypadek: 28,3 GB z 1 159 211 plików w 146 918 folderach:

  • Metoda 1: 2h 15m, 2h 34m: średnio: 2 godziny 25 minut
  • Metoda 2: 49 m, 57 m: średnio: 53 minuty

Wow, metoda 2 jest prawie trzy razy szybsza niż metoda 1! Będę aktualizować mój plik deletestuff.bat!

Hugo
źródło
RD / S / Q działa świetnie, jeśli podasz ścieżkę bezwzględną, ale nie działa podczas pracy ze ścieżkami względnymi. Czy jest jakieś rozwiązanie?
Michael S.
1
@ Hugo: Hugo, pytanie: Czy w powyższych testach czasowych dla jednej lub obu metod policzyłeś pliki bezpośrednio przed uruchomieniem metody? Pytam, ponieważ zawartość folderu może już znajdować się w pamięci podręcznej plików systemu operacyjnego. Dzięki!
William C
@WilliamC: Nie pamiętam dokładnie, ale w przypadku wielokrotnych usunięć o tej samej treści policzę bezpośrednio przed tylko jednym usunięciem i nie powtórzę tego w przypadku innych usunięć (jak już znałem liczby).
Hugo,
1
Zarówno rmdir, jak i del kończą się niepowodzeniem, gdy w ścieżce występują nazwy dłuższe niż 256 znaków.
Nicolai Ehemann
1
OSTRZEŻENIE: jeśli masz dowiązania symboliczne do katalogów del, usuniesz rzeczywiste katalogi, a nie dowiązania symboliczne. Bądź bardzo ostrożny i nie uruchamiaj tych poleceń, chyba że wiesz, że w katalogu docelowym nie ma dowiązań symbolicznych.
user0103
18

Jeśli musisz regularnie usuwać duże drzewa katalogów, rozważ przechowywanie katalogu głównego tego drzewa katalogów na osobnej partycji, a następnie po prostu szybko sformatuj je, gdy zajdzie potrzeba usunięcia wszystkiego. Jeśli chcesz to zautomatyzować, możesz użyć tego polecenia DOS:

echo Y | format Z: /FS:NTFS /X /Q

gdzie Z: jest twoją „zmienną” partycją. Uwaga: partycja nie może mieć etykiety. Blogowałem o tym tutaj .

Mr. Bungle
źródło
I użyj twardego łącza, aby utworzyć połączenie między dyskiem a katalogiem, w którym przechowywane są pliki, jeśli potrzebna jest dokładna ścieżka do katalogu.
Nime Cloud,
1
@NimeCloud: Hardlinks nie może przenikać systemów plików ani katalogów linków.
grawitacja
5
Jednak dowiązania symboliczne mogą przenikać systemy plików i katalogi dowiązań, więc mogą być odpowiednie tutaj. Zobacz komendę mklink (Vista i później; w przeciwnym razie użyj skrzyżowania z Mark Russinovich / SysInternals.)
Robert Calhoun
9

W wierszu polecenia (Start -> Uruchom -> cmd):

del /f /s /q foldername 
lmsasu
źródło
Jest to świetne, ponieważ pokazuje, co usuwa ... ale jest takie samo jak rd pod względem prędkości.
bobobobo
1
Oh woah woah woah. Nie tak dobrze, jak myślałem. Szybko usuwa pliki, ale pozostawia nietknięte drzewo katalogów.
bobobobo
1
Co mogę dodać, zajmuje dużo czasu, aby wyczyścić za pomocą rd.
bobobobo
3
@ bobobobo Zrobiłem kilka testów z ~ 30 GB / 1 000 000 plików / 15 000 folderów, a del + rd jest prawie trzy razy szybszy niż tylko rd: superuser.com/questions/19762/mass-deleting-files-in-windows/...
Hugo
1
Nie powiedzie się, jeśli nazwa ścieżki jest dłuższa niż 256 znaków.
Nicolai Ehemann
7

Oprócz bardzo szybkiego kopiowania / przenoszenia plików (przy użyciu własnego interfejsu API), TeraCopy może usuwać pliki i jest również bardzo szybki. Odkąd dowiedziałem się o TeraCopy, nie używam komputera bez zainstalowanego (jeśli mam skopiować / przenieść / usunąć).

Ten sam instalator instaluje wersję x64, ale aby z niej skorzystać, musisz ją ręcznie wymusić.

Wersja beta, którą polecam w stosunku do stabilnych wersji: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

rautamiekka
źródło
Czy kiedykolwiek zrobiłeś lub widziałeś jakieś porównania czasu TeraCopy z rmdir lub del lub del + rmdir?
Hugo,
1
@ Hugo: Głupie pytanie. Nie poleciłbym TeraCopy, jeśli nie byłby widoczny gołym okiem, jest szybszy!
rautamiekka
5
Czy oceniasz, że jest to 10% szybciej? Dwa razy tak szybko? Dziesięć razy szybciej? Milion razy szybciej? Byłoby wspaniale, gdybyś mógł zmierzyć czas z rmdir za pomocą dwóch dużych i identycznych zestawów testowych.
Hugo,
1
Dziękuję Ci! Korzystam z TeraCopy od lat, ale nigdy nie wiedziałem o funkcji masowego usuwania. I masz rację, to dużo, DUŻO szybciej!
AzDayton
1
@Amalgovinus Nie. Możesz albo otworzyć program i dodać pliki / foldery poprzez przeciągnięcie lub kliknięcie prawym przyciskiem myszy, albo kliknąć prawym przyciskiem myszy pliki / foldery w Eksploratorze / na pulpicie. Po zakończeniu chodzenia, kliknij „Usuń” i „Przenieś do Kosza”, jeśli chcesz, ale faworyzuję „Usuń z dysku”. Musisz jednak uruchomić TeraCopy jako administrator, aby skonfigurować go tak, aby pojawił się w pulpicie / Eksploratorze prawym przyciskiem myszy, jeśli nie jest to zrobione domyślnie.
rautamiekka
6

Zrobiłem plik bat, który robi to samo.

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

wykonuje pracę w dwóch krokach, jeden, próbuje usunąć pliki. Drugim jest próba przejęcia własności plików. Należy zmienić y zgodnie z lokalnym (po angielsku „tak”). Jeśli zadanie nie powiedzie się (na przykład jeśli nie powiedzie się, ponieważ ma pozwolenie), musisz je ponownie uruchomić. Jednak druga runda nie będzie próbowała usunąć plików usuniętych w pierwszej rundzie, więc może być dość szybka.


Jak tego użyć. Zapisz jako delfolder.bat na trasie ścieżki (na przykład c: \ windows), a następnie uruchom go jako

 delfolder "foldername"   

gdzie nazwa_folderu to nazwa folderu

W moim teście usunięcie 123'000 plików zajęło 3 minuty (sata 7200 rpm). TAK!

magallanes
źródło
1
Zwykle nie powinieneś używać %1w skrypcie, ale "%~1". W ten sposób, jeśli argument został przekazany z cudzysłowami, jest on cytowany i rekwotowany. Jeśli nie został przekazany z cytatami, jest cytowany.
Benoit
4

Korzystanie z poniższego kodu zwykle działa dobrze dla mnie.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
Benoit
źródło
Dodaj `> nul` na końcu tego wywołania robocopy, abyś nie musiał widzieć go na ekranie.
JoshDM
Jest podobny do użycia rsyncw systemie Linux. Czy jest tu nawet szybciej rmdir?
Hastur
Do Twojej wiadomości, ta robocopy bardzo różni się od del /f/q/s+ rmdir /s/q. Jeśli Twoje dir_to_wipe zawiera informacje c:\some_important_dir, stracisz swoje dane.
Pavel P
@Pavel następnie użyj / XJ, aby wykluczyć punkty połączeń i dowiązania symboliczne?
Bernhard
To załatwiło sprawę w przypadku katalogu ~ 36 GB, który miał setki katalogów i plików o długości> 256 znaków, co spowodowało, że „metoda” del / rmdir zawiodła. Zajęło to sekundy, Eksplorator Windows oszacował GODZINY!
3

Użyj polecenia rd / s z wiersza polecenia.

JP Alioto
źródło
2
Nie. Jest to tak wolne, jak usuwanie z Eksploratora.
bobobobo
Cóż, w porządku. W każdym razie działa lepiej niż del / f / s / q.
bobobobo
3
Cóż, w rzeczywistości jest O DUŻO lepsze niż używanie Eksploratora do usuwania. Nadal usuwa, nawet jeśli usunięcie lub dwa zakończy się niepowodzeniem (w przypadku gdy odkrywca dusi się i przerywa)
Bobobobo
2

Najlepszym praktycznym rozwiązaniem jest prawdopodobnie przeniesienie folderu gdzieś z drogi (np. Kosz), a następnie rozpoczęcie jego usuwania. To zajmie wieki, ale przynajmniej nie będzie przeszkadzało.

Jestem prawie pewien, że czas potrzebny na usunięcie wszystkich tych plików jest nieodłącznym wymogiem zadania, a nie nieefektywnością w realizacji usuwania.

Ryan Thompson
źródło
1

Zainstaluj Cygwin i użyj rm -r . Ale to prawdopodobnie będzie przesada.

CarlF
źródło
To dokładnie to samo, co rd /q /s...
Joey
Zbyt wiele zadań i prawie równoważna prędkość!
adeelx
1
Nie jest to gorsze niż kilka innych narzędzi instalacyjnych-X-i-użyj-to tutaj i nie powinno się ich głosować, jeśli tak nie jest.
JdeBP
2
Czy cygwin jest rmnaprawdę tak szybki, jak wbudowany program cmd.exe rd? Ponieważ emulacja cygwina interfejsu posix jest raczej powolna, ponieważ wymaga dodatkowej pracy, co rmtak naprawdę nie docenia.
Jan Hudec
Czekając na usunięcie dużej kolekcji plików, miałem wystarczająco dużo czasu, aby zainstalować Cygwin i spróbować rm -rf. Około 10 minut przerwałem i wróciłem do niego, del /f/s/qponieważ w Cygwin użycie dysku wyniosło tylko 50%. Poniżej delzużycie dysku jest ustalone na 100%. Myślę, że to musi być usuwane szybciej. Zużycie procesora wynosi <1% dla obu metod. Nie jestem pewien numeru pliku, ponieważ zamknąłem narzędzie do usuwania plików systemu Windows po 10 minutach obliczeń.
Derek Ziemba
1

Czy masz włączone generowanie krótkich nazw plików? Jeśli tak, czy naprawdę tego potrzebujesz? Usunięcie pliku to tylko operacja na metadanych. Więc jeśli masz dwa razy więcej nazw do usunięcia, ilość pracy jest znacznie wyższa.

MSalters
źródło
0

Czy wypróbowałeś którąś z tych dwóch aplikacji?

Pamiętaj, aby ustawić liczbę zastępowań na 0, jeśli chcesz uzyskać najwyższą wydajność. Zrób to, klikając opcje, a następnie zmień wartość na dole okna dialogowego.

Wprowadź ścieżkę do usunięcia w polu Źródło, a następnie kliknij Usuń.

Te aplikacje nie umieszczają plików w koszu. Używaj ostrożnie.

Stephen Kellett
źródło
0

Ma to na celu uzupełnienie i uzupełnienie kroków podanych we wcześniej wymienionych odpowiedziach.

Podane dwie powyższe metody wydają się dość skuteczne, ale określenie wydajności byłoby trudne, chyba że zostaną porównane z dokładnie tymi samymi warunkami:

  • Urządzenie i model fizycznego dysku twardego
    • Najlepiej, aby ATTO / Crystal Disk przeprowadził testy porównawcze przed klonowaniem danych na nich
  • Ta sama lokalizacja i geometria partycji / objętości
    • Sposobem na zrobienie tego byłoby defragmentowanie przykładowej partycji / folderów i sklonowanie ich dokładnie, ponieważ są to 2 dokładnie takie same typy dysków twardych (z poprzedniego kroku)
  • Następnie wykonaj konfiguracje za pomocą pliku wsadowego i użyj polecenia cmdlet programu Powershell, aby zarejestrować i zmierzyć ich wydajność.

    • Idealnie, dodaj kilka mechanizmów, aby zapobiec stronniczemu buforowaniu z powodu ponownego wystąpienia podobnej aktywności.
  • Oto niektóre przykładowe foldery (nazwane jako całkowity rozmiar), na których eksperymentowałem, ale nie byłem w stanie uzyskać żadnych rozstrzygających wyników / wyników.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Opublikowałbym wyjściowe pliki dziennika, ale uważam, że wariancja jest ogromna ze względu na rozmiary i dystrybucję plików folderów itp.

PowerShell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
Alex S.
źródło
kończy się niepowodzeniem z nazwami> 256 znaków
0

Odpowiedź od Hugo jest najszybsza, ale nie usuwa plików ukrytych ani systemowych w pierwszym przejściu, więc jeśli chcesz bardziej kompletnego rozwiązania, użyj parametru / a:

del /f /s /q /a foldername > nul
rmdir /s /q foldername

O pliku BAT Magallanes , bądź bardzo ostrożny w przypadku takeown i icacls, ponieważ hardlinki mają takie same uprawnienia i właściciele, więc jeśli w folderze, który chcesz usunąć, są nienasycone hardlinks, użycie takeown i icacls zmieni uprawnienia i właścicieli plików na zewnątrz folder.

Za pomocą narzędzia ln.exe możesz wyświetlić listę wszystkich plików dowiązanych w folderze i dowiedzieć się, czy są dowiązane do plików poza folderem (nienasycone dowiązania twarde):

ln.exe --enum foldername > HardlinksList.txt
liamZ
źródło
-1

Usuwanie folderu jest szybsze niż usuwanie wielu plików.

Więc jeśli wolisz używać myszy zamiast wiersza polecenia, możesz utworzyć katalog, przenieść tam pliki i usunąć go (za pomocą Shift + Del, jak powiedziałeś).

danijelk
źródło
2
Katalog powinien zostać utworzony na tej samej partycji, na której znajdują się pliki. Sprawi to, że ruch będzie natychmiastowy. Jeśli nowy folder i pliki znajdują się na osobnych partycjach, cała operacja kopiowania będzie trwać bardzo długo.
5
Skąd pomysł, że usunięcie folderu jest szybsze niż usunięcie plików w nim zawartych? Usunięcie folderu zawiera jako pierwszy krok do usunięcia wszystkich plików w tym folderze, więc nie może być szybsze. Przeprowadzka do kosza to jednak zupełnie inna sprawa, ale nie o to tutaj chodzi.
Joey,