Polecenie MS-DOS, aby usunąć wszystkie pliki oprócz jednego

25

Czy istnieje polecenie MS-DOS, które pozwala mi usunąć wszystkie pliki oprócz jednego?

Jako przykład rozważ następujące pliki:

a.001  
a.002  
a.003  
a.exe  
a.c  

Czy istnieje polecenie usunięcia wszystkich plików oprócz a.c?

nunos
źródło

Odpowiedzi:

36

Aby to zrobić, możesz użyć poleceń fori if:

for %i in (*) do if not "%~i" == a.c del "%~i"

Przechodzi przez bieżący katalog i porównuje każdą nazwę pliku z ac. Jeśli nie pasuje, plik jest usuwany.

Kevin
źródło
+1 nigdy nie pomyślałbym o użyciu tego do prostego usunięcia ... Mnóstwo dobrych odpowiedzi tutaj!
William Hilsum
4
@Wil, kiedy zaczniesz forregularnie używać, wymyślisz dla niego wszelkiego rodzaju szalone scenariusze. :)
Kevin
4
@ Mike, potrzebujesz czegoś takiego jak "dla% i w (A: \ Some \ Path \ *), jeśli nie%% nxi == ac del% i" Pamiętaj, że ścieżka kończy się na *, aby uzyskać pliki w tym folderze oraz, że porównanie dotyczy% ~ nxi, nazwy bez ścieżki. W przypadku takich destrukcyjnych pętli dobrym pomysłem jest wykonanie polecenia „dla ... wykonaj echo% i”, aby sprawdzić, jakie pliki zostaną zmienione przed uruchomieniem polecenia „for… zrób jeśli ... del% i”.
Kevin
1
Lepsze wykorzystaniedel "%i"
Mugen,
1
Jeśli potrzebujesz, aby IFinstrukcja nie uwzględniała wielkości liter, zmień ją na IF /I.
jep
16

Możesz ustawić plik do odczytu tylko przed usunięciem wszystkiego

attrib +r a.c
del *.*
attrib -r a.c
Feiht złodziej
źródło
10

Nie, nie ma. Zrobiłbym katalog, skopiowałem do niego ważny plik, skasowałem . i przenieś plik z powrotem. Następnie usuń plik tymczasowy.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp
David Pfeffer
źródło
1
+1 surowy i technicznie @Feiht złodziej mówi, że jest lepszy sposób na zrobienie tego (więc dałem +1 tam), ale dla szybkości, właśnie tak bym to zrobił.
William Hilsum
3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f
Carlos Gutiérrez
źródło
1
jakie są korzyści []?
barlop
1
@barlop: %fmoże mieć spacje w nazwie pliku.
paradroid
@paradroid nie, to nie pomoże, jeśli [4 r] == [4 r] echo równe Widziałem podobne zrobione przez niektórych, jak z. zamiast []. Mogę zgadywać, dlaczego, ale wolę usłyszeć od kogoś, kto to robi.
barlop,
@barlop: Nie mam pojęcia, co tam właśnie wpisałeś, ale nawiasy kwadratowe działają tak, jak działałyby cudzysłowy.
paradroid
@paradroid C: \> if [4 r] == [4 r] echo abc <ENTER> daje wynik „r] == [4 w tym czasie był nieoczekiwany”. Natomiast C: \> jeśli „4 r” == „4 r” echo abc daje wynik abc. Co więc sprawia, że ​​myślisz, że w jakikolwiek sposób działają one tak, jak znaki cudzysłowu? Nawet C: \> jeśli [ab] == [ab] echo abc <- nie działa daje podobny błąd. b] == [a było w tym czasie nieoczekiwane. Co sprawia, że ​​myślisz, że działają jak cytaty?
barlop,
1
FOR /F "tokens=1-4" %%a in ('dir /a:-d /b /s %app_path%^|find /v "%file%"') DO Del /q %%a %%b %%c %%d
Darth
źródło
Myślę, że byłoby to prawdopodobnie pomocne, gdyby wyjaśniono, co robi. Wygląda na to, że przegląda całe drzewo folderów, czego chcę. %app_path%i %file%są katalogiem głównym drzewa, które należy przechodzić, oraz plikiem, aby odpowiednio uniknąć usuwania. Co to jest ^i dlaczego przekazujemy cztery tokeny na plik do Delpolecenia?
LarsH
0

Dla prędkości używam delen :

delen /! a.c

TCC / LE ma również silniejszedelpolecenie:

del /[!a.c] *
paradroid
źródło
del /[!a.c] *yeldsInvalid switch - "[!a.c]".
karlphillip
@karlphillip: Działa dobrze, „w TCC / LE” .
paradroid
Aha! Nie widziałem wcześniej tego komentarza, dzięki stary.
karlphillip