web-dev-qa-db-fra.com

Supprimer les fichiers de plus de (x) jours?

Quelle est une bonne option de ligne de commande Windows pour supprimer tous les fichiers d'un dossier donné datant de plus de (n) jours?

Notez également qu'il peut y avoir plusieurs milliers de ces fichiers, donc forfiles avec un Shell à cmd n'est pas une bonne idée ici .. à moins que vous n'aimiez générer des milliers de shells de commande. Je considère que c'est un hack assez méchant, alors voyons si on peut faire mieux!

Idéalement, quelque chose intégré à (ou facilement installable dans) Windows Server 2008.

31
Jeff Atwood

J'ai regardé un peu plus autour et trouvé un moyen PowerShell :

Supprimer tous les fichiers de plus de 8 jours du dossier spécifié (avec aperçu)

dir |? {$_.CreationTime -lt (get-date).AddDays(-8)} | del -whatif

(supprimez le-whatif pour y arriver)

44
Jeff Atwood

J'adore la commande PowerShell de Jeff, mais pour une solution vbs alternative pour les machines Windows sans PowerShell, vous pouvez essayer ce qui suit.

Enregistrer sous <filename>.vbs et exécutez:

<filename>.vbs <target_dir> <NoDaysSinceModified> [Action]

Le troisième paramètre, [Action] est facultatif. Sans lui, les fichiers antérieurs à <NoDaysSinceModified> sera répertorié. Lorsqu'il est défini sur D, il supprimera les fichiers antérieurs à <NoDaysSinceModified>

Exemple

PurgeOldFiles.vbs "c:\Log Files" 8

listera tous les fichiers dans c:\Log Files plus de 8 jours

PurgeOldFiles.vbs "c:\Log Files" 8 D

supprimera tous les fichiers dans c:\Log Files plus de 8 jours

note: il s'agit d'une version modifiée du script de Haidong Ji sur SQLServerCentral.com

Option Explicit
on error resume next
    Dim oFSO
    Dim sDirectoryPath
    Dim oFolder
    Dim oFileCollection
    Dim oFile
    Dim iDaysOld
    Dim fAction

    sDirectoryPath = WScript.Arguments.Item(0)
    iDaysOld = WScript.Arguments.Item(1)
    fAction = WScript.Arguments.Item(2)
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    set oFolder = oFSO.GetFolder(sDirectoryPath)
    set oFileCollection = oFolder.Files

If UCase(fAction) = "D" Then
'Walk through each file in this folder collection. 
'If it is older than iDaysOld, then delete it.
    For each oFile in oFileCollection
        If oFile.DateLastModified < (Date() - iDaysOld) Then
            oFile.Delete(True)
        End If
    Next
else
'Displays Each file in the dir older than iDaysOld
    For each oFile in oFileCollection
        If oFile.DateLastModified < (Date() - iDaysOld) Then
            Wscript.Echo oFile.Name & " " & oFile.DateLastModified
        End If
    Next
End If


'Clean up
    Set oFSO = Nothing
    Set oFolder = Nothing
    Set oFileCollection = Nothing
    Set oFile = Nothing
    Set fAction = Nothing
7
PaulPlum

Jetez un oeil à cela http://sourceforge.net/projects/delold car c'est ce que j'utilise.

simple mais fonctionne. delold -d 14 Supprime les fichiers de plus de 14 jours dans le dossier actuel.

4
Ian Stewart

Pas vraiment en ligne de commande, mais j'aime utiliser LINQPad comme hôte de script C #:
(qui vient de me donner une idée pour une ligne de commande C # scripting thingie à la vbs files)

var files = from f in Directory.GetFiles(@"D:\temp", "*.*", SearchOption.AllDirectories)
            where File.GetLastWriteTime(f) < DateTime.Today.AddDays(-8)
            select f;

foreach(var f in files)
    File.Delete(f);
4
Lucas

Quelque chose de similaire peut être réalisé avec la commande "find" de cygwin (ou une autre alternative). Mais cela vous obligerait à installer cygwin ou à avoir la version portable à portée de main.

3
Moshe

Une autre alternative que j'utilisais avant PowerShell:

http://lifehacker.com/133190/geek-to-live--hard-drive-janitor

2
JakeRobinson

J'utilise autoIT pour accomplir cela sur mes systèmes. J'aime que vous puissiez compiler facilement des fichiers .au3. Pas aussi facile d'introduire une faille de sécurité qu'avec un fichier de chauve-souris que n'importe qui peut modifier.

2
DaffyDuc