Команда 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"

Це проходить через поточний каталог і порівнює кожне ім'я файлу з зміном. Якщо воно не відповідає, файл видаляється.


+1 ніколи б не думав використовувати це для простого видалення ... Тут є безліч гарних відповідей!
Вільям Гілсум

4
@Послі, коли ви почнете forрегулярно користуватися, ви придумуєте всілякі шалені сценарії для цього. :)
Кевін

4
@Mike, ви хочете щось на зразок "для% i in (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.
jep

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: \> якщо [4 r] == [4 r] echo abc <ENTER> дає результат "r] == [4 в цей час було несподівано". Тоді як C: \> якщо "4 r" == "4 r" echo abc дає результат abc. Тож що змушує вас думати, що вони будь-яким чином працюють, як цитати? Навіть C: \> якщо [ab] == [ab] echo abc <- не працює, дає аналогічну помилку. b] == [a в цей час було несподівано. Так що змушує вас думати, що вони працюють як цитати?
барлоп

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.