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

48874
nunos

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

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

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

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

24

6 ответов на вопрос

33
Kevin

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

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

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

+1 никогда бы не подумал использовать это для простого удаления ... Множество хороших ответов здесь! William Hilsum 14 лет назад 0
@ Когда вы начнете использовать `for` регулярно, вы придумаете для него всевозможные безумные сценарии. :) Kevin 14 лет назад 4
Как это можно изменить, чтобы использовать другой каталог, кроме текущего? Я попытался изменить * на путь, который закончился *. *, Но без радости. Mike Cole 13 лет назад 0
@ Майк, ты хочешь что-то вроде «для% i в (A: \ Some \ Path \\ *) сделать, если не% ~ nxi == ac del% i» Обратите внимание, что путь заканчивается на *, чтобы получить файлы в этом папка, и это сравнение с% ~ nxi, имя без пути. Для таких деструктивных циклов хорошей идеей будет сделать «for ... do echo% i», чтобы увидеть, какие файлы будут затронуты, перед запуском команды «for ... do if ... del% i». Kevin 13 лет назад 4
Лучше использовать `del"% i "` Mugen 8 лет назад 1
Насколько я знаю, в пакете нет оператора `or` для` if`. Итак, как бы вы удалили все файлы, кроме * два * (или * три *, * четыре *, ...)? Munchkin 7 лет назад 0
@Munchkin, см. Http://stackoverflow.com/q/8438511/91756 для некоторых способов имитации оператора или. Kevin 7 лет назад 0
Если вам нужно, чтобы выражение `IF` не учитывало регистр, измените его на` IF / I`. jep 6 лет назад 1
13
feiht thief

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

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

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

mkdir temp move a.c temp erase *.* move temp\* . rmdir temp 
+1 грубо и технически @Feiht вор говорит, что лучший способ сделать это (так что также дал +1 там), но для скорости, это способ, которым я бы сделал это. William Hilsum 14 лет назад 1
3
Carlos Gutiérrez
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f 
какая выгода []? barlop 13 лет назад 1
@barlop: `% f` может содержать пробелы в имени файла. paradroid 13 лет назад 0
@paradroid нет, это не поможет, если [4 r] == [4 r] эхо равно, я видел подобное, сделанное некоторыми, например, с. вместо []. Я мог бы догадаться, почему, но я бы предпочел услышать это от кого-то, кто это делает. barlop 13 лет назад 0
@ barlop: Понятия не имею, что вы там напечатали, но квадратные скобки работают так же, как и кавычки. paradroid 13 лет назад 0
@paradroid C: \> if [4 r] == [4 r] echo abc дает результат "r] == [4 было неожиданным в это время." Принимая во внимание, что C: \> if "4 r" == "4 r" echo abc дает результат abc. Так что заставляет вас думать, что они в любом случае работают как кавычки? Даже C: \> if [ab] == [ab] echo abc <- не работает, выдает похожую ошибку. б] == [а было неожиданно в это время. Так что заставляет вас думать, что они работают как цитаты? barlop 13 лет назад 0
давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/1303/discussion-between-barlop-and-paradroid) barlop 13 лет назад 0
@paradroid C: \> if [% USERPROFILE%] == [% USERPROFILE%] echo abc и был неожиданным в это время. <- [] не имеет значения. Кроме того, даже без скобок,% f выглядит так: C: \> for / f "tokens = *"% f in ("a b"), если IF% f ==% f, эхо такое же barlop 12 лет назад 0
@paradroid, поэтому скобки никогда не влияют на пробелы. и% f в IF только работает с пробелами. barlop 12 лет назад 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 
Я думаю, что это было бы полезно, если бы было объяснено, что он делает. Похоже, он пересекает целое дерево папок, что я и хочу. `% app_path%` и `% file%` являются корнем дерева для обхода и файла, чтобы избежать удаления, соответственно. Что такое `^`, и почему мы передаем четыре токена на файл команде `Del`? LarsH 8 лет назад 0
0
paradroid

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

delen /! a.c 

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

del /[!a.c] * 
`del / [! ac] *` yelds `Неверный переключатель -" [! ac] ".` karlphillip 12 лет назад 0
@karlphillip: отлично работает, ** "в TCC / LE" **. paradroid 12 лет назад 0
Ага! Не видел этот комментарий раньше, спасибо, брат. karlphillip 12 лет назад 0