MS-DOS-Befehl zum Löschen aller Dateien außer einer

25

Gibt es einen MS-DOS-Befehl, mit dem ich alle Dateien bis auf eine löschen kann?

Betrachten Sie als Beispiel die folgenden Dateien:

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

Gibt es einen Befehl zum Löschen aller Dateien außer a.c?

nunos
quelle

Antworten:

36

Sie können die Befehle forund verwenden if, um dies zu erreichen:

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

Dies durchläuft das aktuelle Verzeichnis und vergleicht jeden Dateinamen mit ac. Wenn es nicht übereinstimmt, wird die Datei gelöscht.

Kevin
quelle
+1 hätte nie gedacht, dies für ein einfaches Löschen zu verwenden ... Jede Menge guter Antworten hier!
William Hilsum
4
@Wil, wenn Sie anfangen, forregelmäßig zu verwenden, finden Sie alle möglichen verrückten Szenarien dafür. :)
Kevin
4
@Mike, Sie möchten "für% i in (A: \ Some \ Path \ *) tun, wenn nicht% ~ nxi == ac del% i" Beachten Sie, dass der Pfad mit * endet, um die Dateien in diesem Ordner abzurufen , und dass der Vergleich gegen% ~ nxi ist, den Namen ohne Pfad. Für destruktive for-Schleifen wie diese ist es eine gute Idee, "for ... do echo% i" zu verwenden, um zu ermitteln, welche Dateien betroffen sind, bevor der Befehl "for ... do if ... del% i" ausgeführt wird.
Kevin
1
Besser verwendendel "%i"
Mugen
1
Wenn für die IFAnweisung die Groß- und Kleinschreibung nicht berücksichtigt werden soll, ändern Sie sie in IF /I.
jep
16

Sie können die Datei so einstellen, dass sie nur gelesen werden kann, bevor Sie alles löschen

attrib +r a.c
del *.*
attrib -r a.c
Dieb
quelle
10

Nein, das gibt es nicht. Ich würde ein Verzeichnis erstellen, die wichtige Datei in dieses kopieren und löschen . und verschieben Sie die Datei zurück. Löschen Sie dann die temporäre Datei.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp
David Pfeffer
quelle
1
+1 grob und technisch @Feiht Dieb sagt eine bessere Art und Weise, es zu tun (so gab es auch +1 dort), aber für die Geschwindigkeit ist dies die Art und Weise, wie ich es tun würde.
William Hilsum
3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f
Carlos Gutiérrez
quelle
1
Welchen Nutzen haben die []?
Barlop
1
@barlop: %fkönnte Leerzeichen im Dateinamen enthalten.
Paradroid
@paradroid nein, das wird nicht helfen, wenn [4 r] == [4 r] Echo gleich ist. anstatt []. Ich könnte raten, warum, aber ich würde es lieber von jemandem hören, der es tut.
Barlop
@barlop: Ich habe keine Ahnung, was Sie gerade dort eingegeben haben, aber die eckigen Klammern funktionieren genauso wie Anführungszeichen.
Paradroid
@paradroid C: \> Wenn [4 r] == [4 r] Echo abc <ENTER> ergibt, ist das Ergebnis "r] == [4 war zu diesem Zeitpunkt unerwartet." Wobei C: \> wenn "4 r" == "4 r" echo abc das Ergebnis abc ergibt. Was lässt Sie glauben, dass sie in irgendeiner Weise wie Anführungszeichen funktionieren würden? Sogar C: \> wenn [ab] == [ab] echo abc <- nicht funktioniert, wird ein ähnlicher Fehler ausgegeben. b] == [a war zu diesem Zeitpunkt unerwartet. Warum denken Sie, dass sie wie Anführungszeichen funktionieren?
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
quelle
Ich denke, das wäre wahrscheinlich hilfreich, wenn erklärt würde, was es tut. Es sieht so aus, als würde es einen ganzen Ordnerbaum durchlaufen, was ich will. %app_path%und %file%sind die Wurzel des zu durchsuchenden Baums bzw. der zu löschenden Datei. Was ist das ^und warum übergeben wir vier Token pro Datei an den DelBefehl?
LarsH
0

Aus Geschwindigkeitsgründen benutze ich delen :

delen /! a.c

TCC / LE hat auch einen mächtigerendelBefehl:

del /[!a.c] *
paradroid
quelle
del /[!a.c] *yeldsInvalid switch - "[!a.c]".
karlphillip
@karlphillip: Es funktioniert gut, "in TCC / LE" .
Paradroid
Aha! Ich habe diesen Kommentar noch nicht gesehen, danke Bruder.
Karlphillip