Команда MS-DOS для удаления всех файлов, кроме одного


25

Есть ли команда MS-DOS, которая позволяет мне удалить все файлы, кроме одного?

Рассмотрим в качестве примера следующие файлы:

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

Есть ли команда для удаления всех файлов, кроме a.c?

Ответы:


36

Вы можете использовать forи ifкоманды для достижения этой цели :

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

Он просматривает текущий каталог и сравнивает каждое имя файла с ac. Если оно не совпадает, файл удаляется.


+1 никогда бы не подумал использовать это для простого удаления ... Множество хороших ответов здесь!
Уильям Хилсум

4
@ Когда вы начнете использовать forрегулярно, вы придумаете для него всевозможные сумасшедшие сценарии. :)
Кевин

4
@ Майк, ты хочешь что-то вроде «для% i в (A: \ Some \ Path \ *) сделать, если не% ~ nxi == ac del% i» Обратите внимание, что путь заканчивается на *, чтобы получить файлы в этой папке и что сравнение с% ~ nxi, именем без пути. Для таких деструктивных циклов хорошей идеей будет сделать «for ... do echo% i», чтобы увидеть, какие файлы будут затронуты, перед запуском команды «for ... do if ... del% i».
Кевин

1
Лучшее использованиеdel "%i"
Mugen

1
Если вам нужно, чтобы в IFзаявлении не учитывался регистр, измените его на IF /I.
января

16

Вы можете установить файл только для чтения, прежде чем удалить все

attrib +r a.c
del *.*
attrib -r a.c

10

Нет, нет Я бы сделал каталог, скопировал в него важный файл, сотри . и переместите файл обратно. Затем удалите временный файл.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp

1
+1 грубо и технически @Feiht вор говорит, что лучший способ сделать это (так что также дал +1 там), но для скорости, это способ, которым я бы сделал это.
Уильям Хилсум

3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f

1
какая выгода []?
Бароп

1
@barlop: %fмогут быть пробелы в имени файла.
парадоид

@paradroid нет, это не поможет, если [4 r] == [4 r] эхо равно, я видел подобное, сделанное некоторыми, например, с. вместо того []. Я мог бы догадаться, почему, но я бы предпочел услышать это от кого-то, кто это делает.
Бароп

@ barlop: я понятия не имею, что вы там напечатали, но квадратные скобки работают так же, как и кавычки.
Парадроид

@paradroid C: \> if [4 r] == [4 r] echo abc <ENTER> дает результат "r] == [4 было неожиданным в это время." Принимая во внимание, что C: \> if "4 r" == "4 r" echo abc дает результат abc. Так что заставляет вас думать, что они в любом случае работают как кавычки? Даже C: \> if [ab] == [ab] echo abc <- не работает, выдает похожую ошибку. б] == [а было неожиданно в это время. Так что заставляет вас думать, что они работают как цитаты?
Бароп

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

Я думаю, что это было бы полезно, если бы было объяснено, что он делает. Похоже, он пересекает целое дерево папок, что я и хочу. %app_path%и %file%являются корнем дерева для обхода и файлом, чтобы избежать удаления, соответственно. Что такое ^и почему мы передаем четыре токена на файл Delкоманде?
LarsH

0

Для скорости я использую delen :

delen /! a.c

TCC / LE также имеет более мощнуюdelкоманду:

del /[!a.c] *

del /[!a.c] *yeldsInvalid switch - "[!a.c]".
karlphillip

@karlphillip: работает нормально, "в TCC / LE" .
paradroid

Ага! Не видел этот комментарий раньше, спасибо, брат.
Карлфиллип
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.