Usuwanie plików starszych niż… (wersje Powershell i Bash)


 

Dziś wtorek, a jak wiadomo wtorek to dobry dzień (w sumie taki sam jakżdy inny :) ) na napisanie jakiegoś eleganckiego skryptu (najlepiej takiego, który wykona za nas jakąś żmudną pracę. W końcu po to piszemy skrypty, żeby ułatwiać sobie ciężkie życie administratora systemów).
Kiedy mówię o skryptach zapewne domyślacie się, że pojawi się kilka linijek napisanych w PowerShell. Jednakowoż, ażeby zachować równowagę skrypt z tą samą funkcjonalnością pojawi się także w wersji na powłokę bash:). Dziś na tapecie pojawia się usuwanie plików starszych niż 7 dni. Oczywiście w skryptach można będzie tą wartość zmienić.

Usuwanie plików starszych niż X dni – wersja PowerShell

Jak widać na poniższym przykładzie, jeśli chcemy manipulować wiekiem plików, jedyne co trzeba zrobić, to zmienić wartość zmiennej $Days na bardziej nas interesującą. Możemy także zmienić folder, który skrypt ma przeszukać – za to odpowiada zmienna $TargetFolder oraz wskazać na wybrane typy plików w zmiennej $Extension (np. dla plików tekstowych powinno to wyglądać tak:

$Extension = "*.txt".
$Now=Get-Date
$Days="7"
$TargetFolder="G:\Wymieniacz"
$Extension="*.*"
$LastWrite=$Now.AddDays(-$Days) 
$Files=Get-Childitem$TargetFolder-Include$Extension-Recurse | Where {$_.LastWriteTime -le"$LastWrite"} 
foreach ($Filein$Files) { if ($File-ne$NULL) { write-host"Deleting File $File"-ForegroundColor"DarkRed"Remove-Item$File.FullName | out-null } 
else { Write-Host"No more files to delete!"-foregroundcolor"Green" } }

Usuwanie plików starszych niż X dni – wersja bash

„Linuksowcy nie gęsi i swoje skrypty też mają…” …czy jakoś tak. Niemniej jednak zanim wdamy się w akademicką dyskusję o wyższości pingwina nad oknami poniżej umieszczam sympatyczny skrypcik o niemal identycznej, jak wersja PowerShell funkcjonalności. Modyfikacja wartości zmiennej DNI pozwala na kontrolę „starości” plików :)

#!/bin/sh
 TODAY=`date +%s`
 DOBA=86400
 DNI=7
 ls $1 | while read file
 do
 MOD_DATE=`stat --format=%Y ${file}`
 DIFF=$(((TODAY-MOD_DATE)/DOBA))
 if [ $DIFF -gt $DNI ]
 then
 echo "File ${file} is older then ${DNI} days - removing file"
 rm -v ${file}
 fi
 done

Czy znacie jeszcze inne (być może prostsze) sposoby na kontrolę i utrzymanie porządku na dyskach poprzez usuwanie plików starszych niż określona ilość dni? Jak uważacie gdzie takie skrypty mogą mieć zastosowanie? Zapraszam do komentowania.


Podobne Tematy:

  • Andrew__M

    Ja bym zrobił tak:
    Windows:
    Forfiles /P C:\folder_do_sprawdzenia /D -7 /c „cmd /c del @path”
    Dla bezpieczeństwa warto dodać /M *.rozszerzenie_pliku

    Linux:
    find /folder_do_sprawdzenia -type f -ctime +7 -exec rm -v {} \;

    Trochę krócej, ale to już kwestia gustu :)

    • Ja bym użył -mtime zamiast -ctime ze skryptów wynika że chcemy usunąć pliki które były modyfikowane dawniej niż jakaś ilość dni. ctime natomiast robi dokładnie to co napisane w tytule.

  • Kimek

    Witam,
    Może ktoś podrzuci pomysł jak zmodyfikować skrypt aby usuwał tylko pliki z folderu głównego bez podfolderów?
    Dzięki

  • Witam,
    Nadałem prawa chmod +x, zmieniłem nazwę skryptu: .nazwa.sh – kropka z przodu, żeby plik nie był widoczny na www.
    Wszystko działa, ale mam pytanie odnośnie, jak uruchomić skrypt w crontab’ie żeby się uruchamiał np. codziennie?
    @daily i co dalej ? :)
    mam coś takiego:
    @daily /home/filip/hltv1/cstrike && sh .usuwanie_starych_dem.sh > /dev/null 2
    Ale nie działa. Proszę o pomoc, z góry dziękuję.

    • Co zapisało Ci w crontabie? Polecenie:

      crontab -l

  • filip@debian:~$ crontab -l
    # Edit this file to introduce tasks to be run by cron.
    #
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    #
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use ‚*’ in these fields (for ‚any’).#
    # Notice that tasks will be started based on the cron’s system
    # daemon’s notion of time and timezones.
    #
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    #
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
    #
    # For more information see the manual pages of crontab(5) and cron(8)
    #
    # m h dom mon dow command
    @daily exec /home/hltv1/cstrike/.usuwanie_starych_dem.sh
    @daily exec /home/hltv2/cstrike/.usuwanie_starych_dem.sh

    • Brakuje mi tam czegoś – w przygotowaniu artykuł o crontab – wytrzymasz? :)

  • Nie ma sprawy. :)

  • Philip

    Wielkie dzięki

  • Raf

    Witam,
    jak przerobić ten skrypt, aby plik skryptu nie musiał znajdować się w folderze z plikami do usunięcia, a sam katalog z zawartością można było zdefiniować jak zmienną?

    Dokładnie w taki sam sposób jak jest to w skrypcie dla Windy.

    Pozdrawiam

  • Super,
    zmieniłem sobie linię:
    rm -v ${file}
    na
    rm -rfv ${file}
    i wywala stare katalogi wraz z zawartością czyli idealnie, ale jak to zrobić żeby nie musiał ten plik siedzieć w tym katalogu, ktory czyści? Pytam dokładnie o to co pytał RAF.

  • tmaciocha

    pojawił mi się taki komunikat i nie wiem co zmienić. pomożesz ?

    At D:testyusuwanie.ps1:7 char:120

    + … oreach ($Filein$Files) { if ($File-ne$NULL) { write-host”Deleting File $File”-Fo .

    ..

    + ~~~~~~

    Unexpected token ‚$Files’ in expression or statement.

    At D:testyusuwanie.ps1:7 char:120

    + … oreach ($Filein$Files) { if ($File-ne$NULL) { write-host”Deleting File $File”-Fo .

    ..

    + ~

    Missing closing ‚)’ in expression.

    At D:testyusuwanie.ps1:7 char:126

    + … ($Filein$Files) { if ($File-ne$NULL) { write-host”Deleting File $File”-Foregrou .

    ..

    + ~

    Unexpected token ‚)’ in expression or statement.

    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException

    + FullyQualifiedErrorId : UnexpectedToken

  • Rostman

    Cześć,
    jak skasować foldery z zawartością na podstawie daty stworzenia nie modyfikacji folderu?
    get-childitem „R:BACKUP” |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays(-14)} |% {remove-item $_ -force -whatif}
    wywala że za długie nazwy folderów
    a to:
    dir „R:BACKUP” |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays(-14)} |% {remove-item $_ -force -whatif}
    nie działa

  • Paweł Rudnicki

    Witam. A czy istnieje możliwość, dodania wartości, która sprawdzałaby ilość wolnego miejsca na dysku? Przykładowo, skrypt „kasowania starszych plików niż” zadziała gdy na dysku będzie mniej niż 20% wolnego miejsca. Dodatkowo, kasowane byłyby pliki np. z przed 5 ostatnich dni.

  • Pablo

    Ja to zrobiłem tak:

    $old = 15
    $now = Get-Date

    Get-ChildItem $path -Recurse |
    Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
    Remove-Item -WhatIf

    Jednak chciałbym to przekształcić i dodać warunek.
    Jeżeli pliki starsze niż 15 dni to uruchom
    1. stop-service spooler
    2. USUŃ PLIKI
    3. ponownie uruchom start-service spooler.

    W przeciwny razie nic nie rób.
    Wiesz może jak to ogarnąć?