2 votes

Supprimer tous les fichiers datant de plus de 365 jours, mais exclure certains dossiers

Edita: Après avoir répondu à @Mbu, je me suis rendu compte que ma première approche, qui consistait à utiliser les chiffres en tête des dossiers comme critères d'exclusion, n'était pas la bonne. J'ai décidé d'utiliser une liste fixe de dossiers à exclure.


Je souhaite supprimer certains fichiers par lots, mais en excluant un ensemble donné de chemins d'accès à vérifier.

Exemple de structure

E:.
|MyBatchFile.cmd
|
yes
      no.doc        | file has wrong extension
      yes.cfg
      yes.dat
      yes.hgr

   yes
           yes.cfg
           yes.dat
           yes.hgr

yes
       yes.cfg
       no.dat        | file is too new, modified within a year
       no.hgr        | file is too new, modified within a year

|no1               | folder is on blacklist
|       importantstuff

no2               | folder is on blacklist
        importantstuff

En oui y non les noms de fichiers démontrent quels fichiers doivent être supprimés

Ce que je veux

Rechercher tous les fichiers dans tous les dossiers et sous-dossiers en commençant par le dossier dans lequel le lot est placé. Si toutes les conditions suivantes sont remplies, le fichier est supprimé.

  1. L'extension du fichier est .cfg, .dat, .hgr ou .txt
  2. modifié l'heure date de plus de 365 jours
  3. Le chemin ne figure pas sur la liste noire

Ce que j'ai essayé

Sur la base de cette question Je l'ai fait :

@echo off
for %%i in (.cfg, .dat, .hdr, .txt) do (
  forfiles /s /m *%%i /d -365 /c "cmd /c del @path"
)
pause

Deux des trois problèmes sont résolus, mais comment exclure un ensemble donné de dossiers.
Comme E:\no1 y E:\no2 de mon exemple.

2voto

Alex North-Keys Points 521

Vous pouvez essayer ce script mais il ne fonctionnera que si %%~tA dans vos paramètres régionaux renvoie la date du fichier au format YMD. Si ce n'est pas le cas, la comparaison ne fonctionnera pas comme prévu.

@Echo Off
setlocal enabledelayedexpansion

for /r %%A in (*.cfg;*.dat;*.hdr) do (
  set p=%%~pA
  set numeric=no
  if "!p:~1,1!"=="0" set numeric=yes
  if "!p:~1,1!"=="1" set numeric=yes
  if "!p:~1,1!"=="2" set numeric=yes
  if "!p:~1,1!"=="3" set numeric=yes
  if "!p:~1,1!"=="4" set numeric=yes
  if "!p:~1,1!"=="5" set numeric=yes
  if "!p:~1,1!"=="6" set numeric=yes
  if "!p:~1,1!"=="7" set numeric=yes
  if "!p:~1,1!"=="8" set numeric=yes
  if "!p:~1,1!"=="9" set numeric=yes

  if !numeric!==yes (
    if "%%~tA" LSS "2012-11-08" (
      del %%A
    )
  )
)

endlocal

EDITAR

Je pense avoir réussi à modifier le script pour qu'il fonctionne comme vous le souhaitez. J'ai dû me débarrasser de /r et appeler un sous-programme de manière récursive, sinon la liste noire ne fonctionnerait pas correctement. La liste noire doit être stockée dans blacklist.txt dans le même répertoire que celui où se trouve le script. Le fichier doit contenir les chemins d'accès complets aux dossiers exclus, sans guillemets :

D:\excluded folder1
D:\excluded folder2
D:\included folder\excluded folder3

Pour chaque dossier qui ne figure pas sur la liste noire, un sous-programme est appelé pour rechercher les fichiers sur la base de leur extension, puis la date de chaque fichier est comparée à la date indiquée. Veuillez tester le script de manière approfondie. Je crains qu'il ne se bloque sur les noms de dossiers contenant des caractères spéciaux tels que % ou ^ .

@Echo Off
call :browse D:
goto :EOF

:browse
for /d %%A in ("%~1\*") do (
  find /i "%%A" %~dp0blacklist.txt > nul
  if errorlevel 1 (
    call :delete "%%A"
    call :browse "%%A"
  ) else (
    echo SKIP %%A
  )
)
goto :EOF

:delete
for %%A in ("%~1\*.cfg" "%~1\*.dat" "%~1\*.hdr") do (
  if "%%~tA" LSS "2012-10-08" (
    echo DEL  %%A
    del "%%A"
  ) else (
    echo SAVE %%A
  )
)
goto :EOF

1voto

Janis Veinbergs Points 4959

Je pense que la réponse de MBu est meilleure que la mienne car elle ne dépend pas d'un outil externe comme Robocopy. Et si la liste des dossiers en liste noire s'allonge, ma commande Robocopy aura l'air moche. Néanmoins, je souhaite partager ce que j'ai trouvé.

Vous pouvez abuser Robocopie pour supprimer les anciens fichiers, filtrer certaines extensions et exclure plusieurs répertoires de l'analyse, le tout en une seule commande.

md C:\TrashMe 
robocopy C:\ C:\TrashMe *.cfg *.hdr *.txt *.dat /MOVE /E /MINAGE:365 /CREATE /R:1 /W:1 /XD C:\dir1 C:\dir2 C:\TrashMe
rd C:\TrashMe

Le lot créera un dossier temporaire de la corbeille nommé TrashMe .
Robocopy déplacera ensuite (et non copiera !) tous les fichiers souhaités (extension correcte et horodatage de modification de plus de 365 jours) dans ce dossier poubelle. Vous pouvez exclure plusieurs dossiers à l'aide de la fonction /XD commutateur.
La dernière action consiste à supprimer le dossier poubelle contenant tous les anciens fichiers trouvés.

L'astuce consiste à utiliser la fonction /CREATE pour que robocopy crée des fichiers de zéro octet à la place du fichier source. Cela permet d'accélérer les commandes de déplacement et de suppression.


La commande Robocopy en détail

  • robocopy appels C:\Windows\System32\Robocopy.exe qui est préinstallé sur Windows Server 2003, Vista, 7 et 8
  • C:\ est le dossier source qui doit être analysé
  • C:\TrashMe est le dossier cible (temporaire) pour tous les fichiers trouvés
  • *.cfg *.hdr *.txt *.dat sont des caractères génériques qui permettent de filtrer certaines extensions de fichiers
  • /MOVE coupera et collera tous les fichiers trouvés au lieu de les copier et coller
  • /E scanne tous les sous-répertoires
  • /MINAGE:365 exclura tous les fichiers datant de plus de 365 jours.
  • /CREATE créera des fichiers à base de zéros au lieu du fichier source d'origine
  • /R:1 /W:1 est le nombre de tentatives et le temps d'attente entre le moment où le fichier est verrouillé et ne peut pas être supprimé.
  • /XD C:\dir1 C:\dir2 C:\TrashMe est ma liste de dossiers en liste noire. J'ai dû inclure également le dossier TrashMe car il est placé dans le dossier source.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X