Comment supprimer tous les fichiers correspondant à un modèle (ou antérieur à ..) à l'exception du fichier le plus récent correspondant au modèle?


-1

J'ai une tâche / un script planifié en cours d'exécution qui prend un instantané d'un fichier toutes les 3 heures, mais le fichier s'agrandit et l'espace disque est limité. Je souhaite donc effectuer un nettoyage toutes les semaines.

Pour l'instant, je le fais manuellement, mais j'espère que cette tâche pourra être automatisée.

Ce que je veux exactement, j'ai un répertoire qui contient ceci:

 B:\>dir
 Volume in drive B is BACKUP
 Volume Serial Number is ****-****

 Directory of B:\

2015-03-04  13:04    <DIR>          MEMORYCRASHDUMPS
2015-03-02  23:59        20 484 150 [20150302235959.082]-Logs.rar
2015-03-03  00:00    <DIR>          Logs
2015-03-01  17:59        67 365 888 [20150301180000.085]-users.sqlite3
2015-03-01  22:50        67 480 576 [20150301230000.368]-users.sqlite3
2015-03-02  00:32        67 480 576 [20150302030000.378]-users.sqlite3
2015-03-02  06:22        67 503 104 [20150302080000.352]-users.sqlite3
2015-03-02  12:59        67 605 504 [20150302130000.084]-users.sqlite3
2015-03-02  17:59        67 740 672 [20150302180000.090]-users.sqlite3
2015-03-02  22:59        67 921 920 [20150302230000.418]-users.sqlite3
2015-03-03  02:58        67 960 832 [20150303030000.088]-users.sqlite3
2015-03-03  07:53        67 966 976 [20150303080000.456]-users.sqlite3
2015-03-03  12:59        68 013 056 [20150303130000.082]-users.sqlite3
2015-03-03  17:59        68 153 344 [20150303180000.081]-users.sqlite3
2015-03-03  22:54        68 339 712 [20150303230000.352]-users.sqlite3
2015-03-04  01:40        68 350 976 [20150304030000.090]-users.sqlite3
2015-03-04  07:51        68 367 360 [20150304080000.358]-users.sqlite3
2015-03-04  12:53        68 452 352 [20150304130000.085]-users.sqlite3
2015-03-04  17:58        68 718 592 [20150304180000.083]-users.sqlite3

Je veux tout supprimer ./*-users.sqlite3, sauf le plus récent (Bonus: Sauf les N les plus récents).

Existe-t-il une commande Windows pratique intégrée pour cela?

J'ai déjà vérifié quelques questions, bien qu'elles ne couvrent que la suppression de fichiers par date / âge ou modèles, elles ne fournissent pas un moyen d'exclure l'élément le plus récent (uniquement un nom de fichier donné).


As-is, vous ne faites que demander un produit qui fait "X", ce qui n’est pas un sujet pour SU.
Ƭᴇcʜιᴇ007

@ Ƭᴇcʜιᴇ007 - Cela peut être fait avec un simple liner via FOR / F avec SKIP. Voir ma réponse
dbenham

Réponses:


3

Simple - traite une liste de répertoires triée par date décroissante via FOR / F et ignore les N premières lignes. Vos noms de fichier contiennent déjà un horodatage qui trie correctement par ordre chronologique afin que vous puissiez trier par nom.

Ce qui suit préservera les 3 fichiers les plus récents. Modifiez simplement la valeur SKIP si nécessaire.

for /f "skip=3 delims=" %F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do @del "%F"

Vous pouvez mettre ce qui précède dans un script batch et paramétrer la valeur de saut.

purgeLog.bat

@echo off
pushd b:\
for /f "skip=%1 delims=" %%F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do del "%%F"
popd

Pour conserver les 2 journaux les plus récents, vous utiliseriez:

purgeLog 2

Si vous pensez que c'est un "simple" one-liner, vous prenez de la drogue. :) +1
Ƭᴇcʜιᴇ007

Sauver la vie! Je devrais sérieusement m'enseigner des compétences par lots qui sont aussi puissantes que mes compétences en C ++ :) Encore une tâche que je vais automatiser et je n'aurai plus jamais à me connecter à la machine dédiée.
Gizmo
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.