Portál AbcLinuxu, 6. května 2025 06:36

Dotaz: Pomoc se zálohovacím bash skriptem

13.6.2014 16:58 Michal
Pomoc se zálohovacím bash skriptem
Přečteno: 429×
Odpovědět | Admin
Zdravím. Každý den mi vzniká nový adresář, kde jsou nasypány různé druhy záloh (dump mysql, zazipovaný /etc...). Lámu si hlavu nad tím, jak odstraňovat staré zálohy.

Potřebuji odstranit zálohu, která: (je starší než 7 dnů) a (není pondělní nebo je starší než měsíc) a (není z prvního dne měsíce nebo je starší než rok)

Hádám, že nejsem zdaleka první, kdo tohle řeší. Prosím tedy o nakopnutí... pokud možno správným směrem ;-)

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.6.2014 17:45 DarkKnight | skóre: 26
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
a adresar je pojmenovany jak? DEN-MESIC-ROK? na smazani dle data by slo pouzit neco jako rm -rf ./backups/`date --date="7 days ago" "+%d-t%m-%Y"` spoustene kazdy den cronem

ohledne zachovani "pondelnich" zaloh (a prvni den v mesici atd.) by se mohla slozka proste prejmenovat, at nespada do pravidelnych zaloh (ktere by se mazaly danym skriptem)... pravdepodobne je to jednodussi, nez resit slozite podminky

druha moznost je treba prochazet vsechny slozky a volat na ne date -r slozka/ (vrati posledni modifikaci slozky)
15.6.2014 11:06 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud takto, tak denně po úspěšné záloze smazat tu nejstarší co nechceš bude asi nejednodušší (určitě bych to nemazal v jiném scriptu než vznikají zálohy).
Pokud je chceš identifikovat názvem tak příkaz date ti vykouzlí jakýkoliv formát data a kdykoliv v minulosti. A pokud chceš přeskočit prvního, tak stačí jedna podmínka opět v kombinaci s příkazem date na den v měsíci (bacha na toto :) ).
Pokud to chceš identifikovat časem vytvoření adresáře tak příkaz find.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
15.6.2014 11:25 w
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
https://www.google.cz/?gfe_rd=cr&ei=SWadU7nnPIaH8Qf40YC4Ag&gws_rd=ssl#q=find+mtime
16.6.2014 06:47 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli je to tedy možné, hodil bych zálohy z pondělí a z prvního dne do extra podadresářů (week , month) no a promazávat v nich je pak už hračka

M.
16.6.2014 23:15 divbyzero | skóre: 6
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj, osobne bych na to bash nepouzil, pres date parsujes text a to je na pytel. Treba PHP by slo, co nejak takto. Nejsem programator, takze urcite to jde lip :)

   date_default_timezone_set('Europe/Berlin');
   $file_list = array();
   $stack[] = '/var/www';

   while ($stack) {
       $current_dir = array_pop($stack);
       if ($dh = opendir($current_dir)) {
           while (($file = readdir($dh)) !== false) {
               if ($file !== '.' AND $file !== '..') {
                   $current_file = "{$current_dir}/{$file}";
                   $report = array();
                   if (is_file($current_file)) {
                       $file_list[] = "{$current_dir}/{$file}";
                   } elseif (is_dir($current_file)) {
                       $stack[] = $current_file;
                       $file_list[] = "{$current_dir}/{$file}/";
                   }
               }
           }
       }
   }


  foreach ($file_list as $id => $file) {
    if (is_file($file)) {
        $file_dayofmonth = date ("j", filemtime("$file"));
        $file_dayofweek = date ("N", filemtime("$file"));

        if ($file_dayofmonth == "1") {
                echo "nemazat (1. v mesici) $file\n";
                break;
        }

        if ($file_dayofweek == "1") {
                echo "nemazat (1. den v tydnu)  $file\n";
                break;
        }

        if (filemtime($file) < (time()-(7*24*60*60))) {
                echo "mazat (stari) $file\n";
               # unlink($file);
        } else {
                echo "nemazat (stari) $file\n";
        }
     }
  }


16.6.2014 23:46 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Máš pravdu, určitě nejsi první, kdo tohle řeší. Mrkni např. na http://gehrcke.de/timegaps/
17.6.2014 17:30 divbyzero | skóre: 6
Rozbalit Rozbalit vše Re: Pomoc se zálohovacím bash skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
krome php asi i takto v bashi:
#!/bin/bash

sourceDir="/backups"

files=($(find $sourceDir -type f -regex "^.*$"))

for item in ${files[*]}
do

   dayofweek=$(date --date=`stat -c %y $item | sed 's/^\([0-9\-]*\).*/\1/'` +"%u")
   dayofmonth=$(date --date=`stat -c %y $item | sed 's/^\([0-9\-]*\).*/\1/'` +"%d")

   if ( [ `find $item -mtime +7` ] && [[ $dayofweek -gt 1 || `find $item -mtime +30` ]] && [[ $dayofmonth -ne 1 || `find $item -mtime +365` ]] ); then
                echo "$item mazat"
         else
                echo "$item nemazat"
   fi

done

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.