Commande MS-DOS pour supprimer tous les fichiers sauf un


25

Existe-t-il une commande MS-DOS qui me permet de supprimer tous les fichiers sauf un?

Prenons comme exemple les fichiers suivants:

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

Existe-t-il une commande pour supprimer tous les fichiers sauf a.c?

Réponses:


36

Vous pouvez utiliser les commandes foret ifpour accomplir cela:

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

Cela passe par le répertoire courant et compare chaque nom de fichier à ac S'il ne correspond pas, le fichier est supprimé.


+1 n'aurait jamais pensé utiliser ceci pour une simple suppression ... Plein de bonnes réponses ici!
William Hilsum

4
@Wil, lorsque vous commencez à utiliser forrégulièrement, vous trouvez toutes sortes de scénarios fous pour cela. :)
Kevin

4
@Mike, vous voulez que quelque chose comme "pour% i dans (A: \ Some \ Path \ *) fasse sinon% ~ nxi == ac del% i" Notez que le chemin se termine par *, pour obtenir les fichiers dans ce dossier , et que la comparaison est contre% ~ nxi, le nom sans chemin. Pour les boucles destructrices comme celle-ci, c'est une bonne idée de faire "for ... do echo% i" pour voir quels fichiers seront affectés avant d'exécuter la commande "for ... do if ... del% i".
Kevin

1
Meilleure utilisationdel "%i"
Mugen

1
Si vous avez besoin que l' IFinstruction soit insensible à la casse, remplacez-la par IF /I.
2018

16

Vous pouvez définir le fichier en lecture seule avant de tout supprimer

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

10

Non, il n'y en a pas. Je créerais un répertoire, y copierais le fichier important, l'effacerais . et ramenez le fichier en arrière. Supprimez ensuite le fichier temporaire.

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

1
+1 brut et techniquement @Feiht voleur dit une meilleure façon de le faire (donc aussi donné +1 là-bas), mais pour la vitesse, c'est la façon dont je le ferais.
William Hilsum

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

1
quels sont les avantages []?
barlop

1
@barlop: %fpourrait avoir des espaces dans le nom de fichier.
paradroid

@paradroid non qui ne sera pas utile pour cela si [4 r] == [4 r] écho égal j'ai vu similaire fait par certains, comme avec. au lieu de []. Je pourrais deviner pourquoi, mais je préfère l'entendre de la part de quelqu'un qui le fait.
barlop

@barlop: Je n'ai aucune idée de ce que vous venez de taper ici, mais les crochets fonctionnent exactement comme les guillemets.
paradroid

@paradroid C: \> if [4 r] == [4 r] echo abc <ENTER> donne le résultat "r] == [4 était inattendu à ce moment." Alors que C: \> si "4 r" == "4 r" echo abc donne le résultat abc. Alors, qu'est-ce qui vous fait penser qu'ils fonctionnent d'une manière ou d'une autre comme les guillemets? Même C: \> si [ab] == [ab] echo abc <- ne fonctionne pas donne une erreur similaire. b] == [a était inattendu pour le moment. Alors, qu'est-ce qui vous fait penser qu'ils fonctionnent comme des guillemets?
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

Je pense que ce serait probablement utile, si on expliquait ce qu'il fait. On dirait qu'il parcourt toute une arborescence de dossiers, c'est ce que je veux. %app_path%et %file%sont respectivement la racine de l'arbre à parcourir et le fichier à éviter. Quel est le ^, et pourquoi passons-nous quatre jetons par fichier à la Delcommande?
LarsH

0

Pour la vitesse, j'utilise delen :

delen /! a.c

TCC / LE a également unedelcommandeplus puissante:

del /[!a.c] *

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

@karlphillip: Cela fonctionne très bien, "dans TCC / LE" .
paradroid

Aha! Je n'ai pas vu ce commentaire avant, merci frère.
karlphillip
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.