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

49135
nunos

Gibt es einen MS-DOS-Befehl, mit dem ich alle Dateien außer einer löschen kann?

Betrachten Sie als Beispiel die folgenden Dateien:

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

Gibt es einen Befehl, alle Dateien außer zu löschen a.c?

24

6 Antworten auf die Frage

33
Kevin

Sie können die Verwendung forund ifbefiehlt, dies zu erreichen:

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

Dies geht durch das aktuelle Verzeichnis und vergleicht jeden Dateinamen mit "ac". Wenn er nicht übereinstimmt, wird die Datei gelöscht.

+1 hätte nie daran gedacht, dies für ein einfaches Löschen zu verwenden ... Jede Menge guter Antworten hier! William Hilsum vor 14 Jahren 0
@Wil, wenn Sie regelmäßig mit 'for' beginnen, finden Sie alle möglichen verrückten Szenarien. :) Kevin vor 14 Jahren 4
Wie kann dies geändert werden, sodass es ein anderes Verzeichnis als das aktuelle Verzeichnis verwendet? Ich versuchte, das * in einen Pfad zu ändern, der mit *. * Endete, aber keine Freude. Mike Cole vor 13 Jahren 0
@ Mike, du willst etwas wie "für% i in (A: \ Some \ Path \\ *), wenn nicht% ~ nxi == ac del% i" Beachte, dass der Pfad mit * endet, um die Dateien darin zu erhalten Ordner, und dass der Vergleich gegen% ~ nxi ist, der Name ohne Pfad. Für destruktive Schleifen wie diese ist es eine gute Idee, "for ... do echo% i" zu tun, um zu sehen, welche Dateien betroffen sind, bevor der Befehl "for ... do if ... del% i" ausgeführt wird. Kevin vor 13 Jahren 4
Verwenden Sie besser "del"% i "` Mugen vor 7 Jahren 1
Soweit ich weiß, gibt es keinen "oder" Operator für "if" im Stapel. Wie würden Sie also alle Dateien löschen, außer * zwei * (oder * drei *, * vier *, ...)? Munchkin vor 7 Jahren 0
@Munchkin, siehe http://stackoverflow.com/q/8438511/91756 für einige Möglichkeiten, eine oder eine Anweisung zu simulieren. Kevin vor 7 Jahren 0
Wenn Sie die "IF" -Anweisung benötigen, um zwischen Groß- und Kleinschreibung zu unterscheiden, ändern Sie sie in "IF / I". jep vor 5 Jahren 1
13
feiht thief

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

attrib +r a.c del *.* attrib -r a.c 
8
David Pfeffer

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

mkdir temp move a.c temp erase *.* move temp\* . rmdir temp 
+1 grob und technisch sagt @Feiht Dieb einen besseren Weg, es zu tun (also gab es auch +1), aber für die Geschwindigkeit würde ich es so machen. William Hilsum vor 14 Jahren 1
3
Carlos Gutiérrez
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f 
Welchen Nutzen haben die []? barlop vor 12 Jahren 1
@ barlop: `% f` könnte Leerzeichen im Dateinamen enthalten. paradroid vor 12 Jahren 0
@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 vor 12 Jahren 0
@ barlop: Ich habe keine Ahnung, was Sie dort gerade eingegeben haben, aber die eckigen Klammern funktionieren genau wie Anführungszeichen. paradroid vor 12 Jahren 0
@paradroid C: \> wenn [4 r] == [4 r] echo abc ergibt das Ergebnis "r] == [4 war zu diesem Zeitpunkt unerwartet." Während C: \> wenn "4 r" == "4 r" ist, ergibt das Echo abc das Ergebnis abc. Also, warum glauben Sie, dass sie in irgendeiner Weise funktionieren wie Anführungszeichen? Sogar C: \> if [ab] == [ab] echo abc <- funktioniert nicht, führt zu einem ähnlichen Fehler. b] == [a war zu diesem Zeitpunkt unerwartet. Warum glauben Sie, dass sie wie Zitate funktionieren? barlop vor 12 Jahren 0
Lasst uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/1303/discussion-between-barlop-and-paradroid) barlop vor 12 Jahren 0
@paradroid C: \> if [% USERPROFILE%] == [% USERPROFILE%] echo abc und war zu dieser Zeit unerwartet. <- [] macht keinen Unterschied. Auch ohne die Klammern sieht% f Works C: \> für / f "tokens = *"% f in ("a b") tun, wenn% f ==% f gleich ist barlop vor 12 Jahren 0
@paradroid also haben Klammern niemals Auswirkungen auf Leerzeichen. und% f in einem IF funktioniert nur mit Leerzeichen. barlop vor 12 Jahren 0
1
Darth
FOR /F "tokens=1-4" %%a in ('dir /a:-d /b /s %app_path%^|find /v "%file%"') DO Del /q %%a %%b %%c %%d 
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 durchqueren, was ich will. `% app_path%` und `% file%` sind der Stamm der zu durchsuchenden Baumstruktur bzw. die Datei, um das Löschen zu vermeiden. Was ist das `^` und warum übergeben wir vier Token pro Datei an den `Del`-Befehl? LarsH vor 8 Jahren 0
0
paradroid

Für die Geschwindigkeit benutze ich delen :

delen /! a.c 

TCC / LE hat auch einen stärkerendelBefehl:

del /[!a.c] * 
del / [! ac] * `ruft` Ungültiger Schalter - "[! ac]". ` karlphillip vor 12 Jahren 0
@karlphillip: Es funktioniert gut, ** "in TCC / LE" **. paradroid vor 12 Jahren 0
Aha! Ich habe diesen Kommentar vorher nicht gesehen, danke bro. karlphillip vor 12 Jahren 0