Usunąć pliki starsze niż (x) dni?

31

Jaka jest dobra opcja wiersza polecenia systemu Windows do usuwania wszystkich plików w danym folderze starszym niż (n) dni?

Zauważ też, że może istnieć wiele tysięcy tych plików, więc forfilesużycie powłoki cmdto nie jest świetnym pomysłem tutaj, chyba że lubisz spawnować tysiące powłok poleceń. Uważam to za dość nieprzyjemny hack, więc zobaczmy, czy da się lepiej!

Idealnie, coś wbudowanego (lub łatwego do zainstalowania) w Windows Server 2008.

Jeff Atwood
źródło
2
Nowa metoda oparta na pliku .BAT, która używa tylko wewnętrznych poleceń CMD.EXE, została opublikowana tutaj: stackoverflow.com/questions/9746778/…

Odpowiedzi:

43

Rozejrzałem się trochę więcej i znalazłem sposób na PowerShell :

Usuń wszystkie pliki starsze niż 8 dni z określonego folderu (z podglądem)

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

(usuń -whatif, aby tak się stało)

Jeff Atwood
źródło
1
Aby potwierdzić, czy powoduje to trwałe usunięcie plików lub ich ponowne przetworzenie?
TimS
Operacje zbyt trudne do zapamiętania !! Uwielbiam PowerShell, ale myślę, że lepszym sposobem jest użycie robocopy
AminM
7

Uwielbiam polecenie Jeffa PowerShell, ale dla alternatywnego rozwiązania VBS dla komputerów z systemem Windows bez programu PowerShell można wypróbować następujące.

Zapisz jako <filename>.vbsi wykonaj:

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

Trzeci parametr [Action]jest opcjonalny. Bez niego pliki starsze niż <NoDaysSinceModified>zostaną wymienione. Po ustawieniu Dspowoduje to usunięcie plików starszych niż<NoDaysSinceModified>

Przykład

PurgeOldFiles.vbs "c:\Log Files" 8

wyświetli listę wszystkich plików c:\Log Filesstarszych niż 8 dni

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

będzie usunąć wszystkie pliki c:\Log Filesstarsze niż 8 dni

Uwaga: jest to zmodyfikowana wersja skryptu Haidong Ji na 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
PaulPlum
źródło
Używam czegoś takiego do usuwania starych dzienników serwera WWW. Wyszło całkiem nieźle.
jeffspost
4

Nie do końca wiersza poleceń, ale lubię używać LINQPad jako hosta skryptowego w języku C #:
(co właśnie dało mi pomysł na skryptowe pliki w języku C # do obsługi plików vbs)

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);
Lucas
źródło
Linq jest naprawdę niesamowity, chciałbym, żeby wprowadził się do PowerShell.
Taylor Gibb,
4

Spójrz na ten http://sourceforge.net/projects/delold, ponieważ tego właśnie używam.

proste, ale działa. delold -d 14 Usuwa pliki starsze niż 14 dni w bieżącym folderze.

Ian Stewart
źródło
3

Coś podobnego można osiągnąć za pomocą komendy cygwina (lub innej alternatywy) „znajdź”. Wymagałoby to jednak zainstalowania programu Cygwin lub posiadania wersji przenośnej.

Mosze
źródło
2

Korzystam z autoIT, aby to osiągnąć w moich systemach. Podoba mi się, że możesz łatwo skompilować pliki .au3, aby exe. Wprowadzenie luki w zabezpieczeniach nie jest tak łatwe, jak w przypadku pliku nietoperza, który każdy może edytować.

DaffyDuc
źródło