Lệnh MS-DOS xóa tất cả các tệp trừ một


25

Có lệnh MS-DOS nào cho phép tôi xóa tất cả các tệp trừ một tệp không?

Hãy xem xét như một ví dụ về các tệp sau:

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

Có một lệnh để xóa tất cả các tập tin ngoại trừ a.c?

Câu trả lời:


36

Bạn có thể sử dụng các lệnh forifđể thực hiện điều này:

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

Điều này đi qua thư mục hiện tại và so sánh từng tên tệp với ac Nếu không khớp, tệp sẽ bị xóa.


+1 sẽ không bao giờ nghĩ đến việc sử dụng điều này để xóa đơn giản ... Vô số câu trả lời hay ở đây!
William Hilsum

4
@Wil, khi bạn bắt đầu sử dụng forthường xuyên, bạn đưa ra tất cả các loại kịch bản điên rồ cho nó. :)
Kevin

4
@Mike, bạn muốn một cái gì đó như "for% i in (A: \ some \ Path \ *) làm nếu không% ~ nxi == ac del% i" Lưu ý rằng đường dẫn kết thúc bằng *, để lấy các tệp trong thư mục đó và so sánh với% ~ nxi, tên không có đường dẫn. Để phá hủy các vòng lặp như thế này, bạn nên thực hiện "for ... do echo% i" để xem các tệp nào sẽ bị ảnh hưởng trước khi chạy lệnh "for ... do if ... del% i".
Kevin

1
Sử dụng tốt hơndel "%i"
Mugen

1
Nếu bạn cần IFcâu lệnh không phân biệt chữ hoa chữ thường, hãy đổi nó thành IF /I.
jep

16

Bạn có thể đặt tệp chỉ đọc trước khi xóa mọi thứ

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

10

Không, không có. Tôi sẽ tạo một thư mục, sao chép tập tin quan trọng vào đó, xóa đi . và di chuyển tệp trở lại. Sau đó xóa tệp tạm thời.

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

1
+1 thô sơ và kỹ thuật @Feiht kẻ trộm nói một cách tốt hơn để làm điều đó (vì vậy cũng cho +1 ở đó), nhưng đối với tốc độ, đây là cách tôi sẽ làm.
William Hilsum

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

1
[] là lợi ích gì?
barlop

1
@barlop: %fcó thể có khoảng trắng trong tên tệp.
paradroid

@paradroid không giúp được gì cho điều đó nếu [4 r] == [4 r] echo bằng tôi đã thấy một số tương tự được thực hiện bởi một số người, như với. thay vì []. Tôi có thể đoán tại sao, nhưng tôi muốn nghe nó từ ai đó làm điều đó.
barlop

@barlop: Tôi không biết bạn vừa gõ gì ở đó, nhưng dấu ngoặc vuông hoạt động giống như dấu ngoặc kép.
paradroid

@paradroid C: \> if [4 r] == [4 r] echo abc <ENTER> cho kết quả "r] == [4 là bất ngờ tại thời điểm này." Trong đó C: \> nếu "4 r" == "4 r" echo abc cho kết quả abc. Vì vậy, những gì làm cho bạn nghĩ rằng họ trong bất kỳ cách nào làm việc như dấu ngoặc kép sẽ? Ngay cả C: \> if [ab] == [ab] echo abc <- không hoạt động cũng cho lỗi tương tự. b] == [a là bất ngờ tại thời điểm này. Vì vậy, những gì làm cho bạn nghĩ rằng họ làm việc như dấu ngoặc kép?
barlop

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

Tôi nghĩ rằng điều này có thể hữu ích, nếu nó được giải thích những gì nó làm. Có vẻ như nó đi qua toàn bộ cây thư mục, đó là những gì tôi muốn. %app_path%%file%là gốc của cây để duyệt, và tệp để tránh xóa, tương ứng. Cái gì là ^và tại sao chúng ta chuyển bốn mã thông báo cho mỗi tệp cho Dellệnh?
LarsH

0

Đối với tốc độ, tôi sử dụng delen :

delen /! a.c

TCC / LE cũng có mộtdellệnhmạnh mẽ hơn:

del /[!a.c] *

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

@karlphillip: Nó hoạt động tốt, "trong TCC / LE" .
paradroid

Aha! Không thấy bình luận đó trước đây, cảm ơn người anh em.
karlphillip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.