Perintah MS-DOS untuk menghapus semua file kecuali satu


25

Apakah ada perintah MS-DOS yang memungkinkan saya untuk menghapus semua file kecuali satu?

Pertimbangkan sebagai contoh file-file berikut:

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

Apakah ada perintah untuk menghapus semua file kecuali a.c?

Jawaban:


36

Anda dapat menggunakan fordan ifmemerintahkan untuk melakukan ini:

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

Ini melewati direktori saat ini, dan membandingkan setiap nama file dengan ac. Jika tidak cocok, file dihapus.


+1 tidak akan pernah berpikir untuk menggunakan ini untuk penghapusan sederhana ... Banyak jawaban bagus di sini!
William Hilsum

4
@Apakah, ketika Anda mulai menggunakan forsecara teratur, Anda membuat semua jenis skenario gila untuk itu. :)
Kevin

4
@ Mike, Anda menginginkan sesuatu seperti "untuk% i di (A: \ Some \ Path \ *) lakukan jika tidak% ~ nxi == ac del% i" Perhatikan bahwa path berakhir pada *, untuk mendapatkan file di folder itu , dan perbandingannya dengan% ~ nxi, nama tanpa jalur. Untuk destruktif untuk loop seperti ini, adalah ide yang baik untuk melakukan "for ... do echo% i" untuk melihat file apa yang akan terpengaruh sebelum menjalankan perintah "for ... do if ... del% i".
Kevin

1
Penggunaan yang lebih baikdel "%i"
Mugen

1
Jika Anda ingin IFpernyataan tidak peka huruf besar-kecil, ubah ke IF /I.
jep

16

Anda dapat mengatur file untuk dibaca hanya sebelum menghapus semuanya

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

10

Tidak, tidak ada. Saya akan membuat direktori, menyalin file penting ke dalamnya, hapus . , dan pindahkan file kembali. Kemudian hapus file temp.

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

1
+1 kasar dan secara teknis pencuri @Feiht mengatakan cara yang lebih baik untuk melakukannya (jadi beri +1 juga di sana), tetapi untuk kecepatan, ini adalah cara yang akan saya lakukan.
William Hilsum

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

1
apa manfaatnya []?
barlop

1
@barlop: %fbisa ada spasi di nama file.
paradroid

@paradroid tidak ada yang tidak akan membantu untuk itu jika [4 r] == [4 r] sama dengan yang pernah saya lihat serupa dilakukan oleh beberapa orang, seperti dengan. dari pada []. Saya bisa menebak mengapa, tetapi saya lebih suka mendengarnya dari seseorang yang melakukannya.
barlop

@barlop: Saya tidak tahu apa yang baru saja Anda ketik di sana, tetapi tanda kurung berfungsi seperti tanda kutip.
paradroid

@paradroid C: \> jika [4 r] == [4 r] echo abc <ENTER> memberikan hasil "r] == [4 tidak terduga saat ini." Sedangkan C: \> jika "4 r" == "4 r" echo abc memberikan hasil abc. Jadi apa yang membuat Anda berpikir bahwa cara mereka bekerja seperti tanda kutip? Bahkan C: \> jika [ab] == [ab] echo abc <- tidak berfungsi memberikan kesalahan serupa. b] == [a tidak terduga pada saat ini. Jadi apa yang membuat Anda berpikir itu berfungsi seperti kutipan?
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

Saya pikir ini mungkin akan membantu, jika dijelaskan apa fungsinya. Sepertinya melintasi seluruh folder tree, itulah yang saya inginkan. %app_path%dan %file%merupakan akar dari pohon untuk dilintasi, dan file untuk menghindari penghapusan, masing-masing. Apa itu ^, dan mengapa kita melewatkan empat token per file ke Delperintah?
LarsH

0

Untuk kecepatan, saya menggunakan delen :

delen /! a.c

TCC / LE juga memilikidelperintahyang lebih kuat:

del /[!a.c] *

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

@karlphillip: Berhasil, "dalam TCC / LE" .
paradroid

Aha! Tidak melihat komentar itu sebelumnya, terima kasih kawan.
karlphillip
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.