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

25

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

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

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

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

nunos
источник

Ответы:

36

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

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

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

Kevin
источник
+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
Darth
источник
Я думаю, что это было бы полезно, если бы было объяснено, что он делает. Похоже, он пересекает целое дерево папок, что я и хочу. %app_path%и %file%являются корнем дерева для обхода и файлом, чтобы избежать удаления, соответственно. Что такое ^и почему мы передаем четыре токена на файл Delкоманде?
LarsH
0

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

delen /! a.c

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

del /[!a.c] *
Paradroid
источник
del /[!a.c] *yeldsInvalid switch - "[!a.c]".
karlphillip
@karlphillip: работает нормально, "в TCC / LE" .
paradroid
Ага! Не видел этот комментарий раньше, спасибо, брат.
Карлфиллип