Jak skasować katalogi oprócz najnowszego?

pytanie_do_specaOd czasu do czasu mailowo lub w komentarzach prosicie o pomoc w rozwiązaniu konkretnego problemu. Niektóre z zadawanych są bardzo intrygujące i zasługują na opublikowanie w formie artykułu-porady. Pod wpisem o programie FORFILES, padało pytanie:

Jak skasować wszystkie katalogi oprócz najnowszego?


Scenariusz jest następujący: Każdy użytkownik ma swój katalog na wspólnym udziale sieciowym, gdzie zrzucane są jego dzienne backupy. Dla oszczędności miejsca należy kasować backupy, lecz kasowanie po dacie jest wykluczone, bo użytkownik może przez jakiś czas być nieobecny w pracy i nowe katalogi nie będą się pojawiać. W tym wypadku należy przechowywać jego ostatni backup niezależnie od tego, ile ma dni.

Rozwiązanie

Tak więc, ja zaproponuje stary dobry Wiersz Poleceń (plik wsadowy) – jeżeli znacie sprytniejszą metodę, koniecznie napiszcie komentarz.

FOR /F „delims=|” %%I IN (‚dir /ad /B /O:D’) DO SET najnowszy=%%I

FOR /F „delims=|” %%d in (‚dir /ad /B ^| findstr /V „%najnowszy%”‚) do RmDir /S /Q „%%d”

(uwaga przy kopiowaniu – zapytania w nawiasie są w pojedynczych cudzysłowach)

Objaśnienie:

W pętli FOR wykonujemy sortowanie katalogu po datach

DIR /ad /B /O:D

ostatni katalog na liście (najnowszy) zostanie dopisany do zmiennej „najnowszy”:

DO SET najnowszy=%%I

Druga pętla znowu przeszukuje katalog (bez znaczenia w jakiej kolejności) i wyświetla wszystkie katalogi oprócz tego, który przypisaliśmy do zmiennej „najnowszy”.

‚dir /ad /B ^| findstr /V „%najnowszy%”‚

Każdy znaleziony w ten sposób katalog zostanie usunięty wraz z zawartością (RmDir /S) w trybie bez potwierdzeń (RmDir /Q)

W pełni się zgadzam z twierdzeniem, że to rozwiązanie jest bardzo old-school’owe, ale takie czasami najlepiej się sprawdzają 🙂

A Wy, macie jakieś ciekawe pomysły?

Łukasz Skalikow

Obecnie Manager IT. Przez lata byłem Inżynierem systemów. Jestem entuzjastą i specem od vSphere, Windows serwer, GPO. Od zawsze byłem zwolennikiem wiersza poleceń i automatyzacji. Obecnie, ze względu na pracę, rodzinę i wyjazdy służbowe, dużo mniej udzielam się na blogu, ale mam nadzieję, że pośród kilkuset porad opublikowanych na spece.it, wiele osób znajdzie dla siebie coś przydatnego :)

Przeczytaj także...

3 komentarze

  1. gmeger napisał(a):

    można też tak z tym, ze w linuksach.
    find . -type d ! -name . -printf ‚%T@ %p\n’ |sort -k 1nr |sed ‚s/^[^ ]* //’ |tail -n+2 |xargs rm -R

    – szukamy katalogów w bieżącym folderze (find . -type d)
    – z wyjątkiem bieżącego (! -name .)
    – wyniki prezentujemy z timestampem daty – do wyboru daty modyfikacji, utworzenia itp. (-printf ‚%T@ %p\n’)
    – wynik sortujemy (sort -k 1nr)
    – usuwamy datę z wyniku wyszukiwania – była potrzebna tylko do sortowania (sed ‚s/^[^ ]* //’)
    – wyświetlamy wszystkie katalogi poza najnowszym (tail -n+2)
    – wykonujemy polecenie rm -R dla wyników

    działamito chociaż czuję, że można prościej 😉

    gm

  2. Zdzich napisał(a):

    OK,poradziłem sobie przy pomocy PowerShell bazując na http://nisanthkv.blog.com/2012/07/30/removing-backup-folders-solution-1
    Oto rezultat:
    Get-ChildItem MediaID.bin -Path D:\Users -Recurse | ForEach-Object {$_.DirectoryName} | ForEach-Object {Get-ChildItem „Backup Set*” -Path $_ | Sort-Object LastWriteTime -descending | Select-Object -Skip 1 | ForEach-Object {“Removing file $($_.FullName)”; Remove-Item $_.FullName -Recurse -Force}}

Dodaj komentarz