Lo script è stato studiato per creare backup sincronizzati delle directory contenute nella home dell'utente, fornendo la possibilità di scegliere quali siano le dir che si vuole sincronizzare usando la variabile FOLDER
contenuta nella funzione RSYNC
. Nella funzione CHECK
vengono rilevati e analizzati i dischi collegati al sistema permettendo il proseguo del backup qualora vi siano i permessi e lo spazio sufficiente per la scrittura dei dati. Terminata la fase di backup gli snapshot vengono creati una sola volta in una cartella separata dove la cronologia mensile ai vecchi file sarà sempre disponibile, qualora volessimo recuperare i file non più presenti nell'attuale backup. Il primo giorno del mese la funzione ERASE
provvede ad eliminare gli snapshot più vecchi di 30 giorni.Naturalmente è possibile automatizzare i propri backup usando il tool cron
, nel mio caso sincronizzo i miei dati ogni ora. In futuro cercherò, per quanto nelle mie possibilità, di aggiungere alcuni miglioramenti e qualora, tra gli utenti ci fosse qualcuno intenzionato ad utilizzare lo script e avesse dei consigli da dare è naturalmente il benvenuto.
#! /bin/bash # Versione Script : 6.0 # Autore : Antonello Collini, gollum.suseit@gmail.com # Data di creazione : 01-set-2010 # Ultima Revisione : 05-mar-2012 # Recupera il nome dell'utente di sistema USER="$LOGNAME" # Assegna alla directory di salvataggio il nome # del proprietario della home DIR="Dati_$USER" # Nome dell'archivio degli snapshot ARC="Old_Files_$USER" # Recupera il numero del giorno del mese DAY_OF_MONTH=`LANG=it_IT date +%d` # Recupera il nome del mese NAME_OF_MONTH=`LANG=it_IT date +%B` # Recupera il numero del mese. MONTH_OF_YEAR=`LANG=it_IT date +%m | sed 's/^0//'` CHECK () { # Assegna un numero al totale dei dischi montati dal file temporaneo. NUM_DEV=`wc /tmp/device-$USER.lst | awk '{print $1}'` echo "" echo "VERIFICO LE UNITA DISCO COLLEGATE AL SISTEMA." # Itera il controllo dello spazio sui dischi finchè non ci sono più drive da controllare. while [ $NUM_DEV -ge 0 ] do # Recupera il nome del primo disco presente nella lista. DEV=`head -n1 /tmp/device-$USER.lst` # Recupera la dimensione in blocchi da 1M della directory home. DIR_SIZE=`df -m $HOME | sed '1d' | awk '{print $3}'` # Recupera lo spazio disponibile in blocchi da 1M del disco analizzato. DISP_SIZE=`df -m $DEV | sed '1d' | head -n1 | awk '{print $4}'` # Se la stringa DEV non sia nulla e che sia scrivibile # nel caso le due condizioni siano entrambe false il programma # restituisce un errore. if [[ -n "$DEV" && -w "$DEV" ]] then echo "" echo "L'unità disco $DEV è collegata." else echo "" echo "Il sistema non ha rilevato altre unità disco." echo "Oppure non sono sufficienti i permessi per accedervi." echo "" echo "IMPOSSIBILE PROSEGUIRE CON IL BACKUP." exit 1 fi # Modifica il file device-user.lst eliminando di volta # in volta la prima riga contenente il nome di un disco # collegato. `sed -i -e '1d' /tmp/device-$USER.lst >> /tmp/device-$USER.lst` # Conta il numero delle unità collegate NUM_DEV=$((NUM_DEV--)) # Se la misura in blocchi della home è maggiore di quella # della partizione del disco esterno il programma restituisce # un errore e passa al disco successivo (se esite) altrimenti # termina il programma. echo "" echo "VERIFICO LA DIMENSIONE DELLO SPAZIO DISPONIBILE SULL'UNITA." if [ $DIR_SIZE -ge $DISP_SIZE ] then echo "" echo "ERRORE, SPAZIO INSUFFICIENTE!" echo "Controllo se ci sono altre unità disco collegate." continue else echo "" echo "SPAZIO DISPONIBILE" RSYNC fi done } ERASE () { # Elenco da cui ricavare il nome del mese per creare oppure eliminare gli Snapshot. MONTH=("gennaio" "febbraio" "marzo" "aprile" "maggio" "giugno" "luglio" "agosto" "settembre" "ottobre" "novembre" "dicembre" ) # Recupera il nome del primo disco presente nella lista. DEV=`head -n1 /tmp/device-$USER.lst` # Toglie al numero del mese corrente un valore corripsondente # ai mesi di cui si vuole mantenere le copie di backup. OLDMONTH=$((MONTH_OF_YEAR-3)) # Itera il controllo sugli Snapshot da eliminare # fino a quando il numero del mese è diverso da quello corrente. while [ $OLDMONTH -ge 0 ] do if [ -e "$DEV/$ARC/${MONTH[$OLDMONTH]}" ] then echo "" TEST=1 else echo "" TEST=2 fi case $TEST in 1) echo "Lo Snapshot di ${MONTH[$OLDMONTH]} non è stato eliminato." echo "Eliminazione" rm -rf "$DEV/$ARC/${MONTH[$OLDMONTH]}" ;; 2) echo "Lo Snapshot di ${MONTH[$OLDMONTH]} è stato eliminato!" ;; esac OLDMONTH=$((OLDMONTH-1)) done # Richiama la funzione CHECK CHECK } RSYNC () { # Controlla l'esistenza della directory finale per il # salvataggio dei file in caso positivo prosegue con la # sincronizzazione, altrimente provvede a crearla onde # permettere il proseguo del programma. echo "" echo "CONTROLLO L'ALBERO DELLA DIRECTORY $DIR" if [ -e "$DEV/$DIR" ] then echo "" echo "Directory presente!" echo "" else echo"" echo "Directory mancante, provvedo a crearla!" mkdir -p "$DEV/$DIR" fi # Controlla l'esistenza dello Snapshot giornaliero. # In caso positivo il programma prosegue altrimenti, # provvederà a creare una copia dei vecchi file. # if [ -e "$DEV/$ARC/$NAME_OF_MONTH/$DAY_OF_MONTH" ] then echo "" echo "UNO SNAPSHOT CON QUESTA DATA ESISTE!" echo "PROSEGUO CON IL PROGRAMMA" echo "" else echo "" echo "CREO UNO SNAPSHOT AI VECCHI FILE." echo "" mkdir -p "$DEV/$ARC/$NAME_OF_MONTH" cp -al "$DEV/$DIR/" "$DEV/$ARC/$NAME_OF_MONTH/$DAY_OF_MONTH" fi ######################################### #INSERIRE NELLA VARIABILE FOLDER LE # #CARTELLE DELLA HOME CHE SI VOGLIONO # #SINCRONIZZARE. # ######################################### FOLDER=(bin Documenti Immagini Musica Scaricati Scrivania Video) # Recupera il numero delle cartelle contenute nell'array FOLDER. VAR=${#FOLDER[*]} COUNT=0 # Itera il processo di sincronizzazione finchè il numero # delle cartelle da sincronizzare sarà maggiore della # variabile contatore. while [ $COUNT -lt $VAR ] do echo "Sincronizzo i file della cartella: ${FOLDER[$COUNT]}" rsync -ra "$HOME/${FOLDER[$COUNT]}" --delete "$DEV/$DIR/" COUNT=$((COUNT+1)) done } # Recupera il nome dei dischi montati sul sistema e li salva # un file temporaneo nella dir /tmp. `df | grep /media/ | awk '{print $6}' > /tmp/device-$USER.lst` # Verifica il primo giorno del mese, nel caso il test # sia positivo crea un archivio tar dei file del mese # concluso. "Scegliere se eliminare il backup più vecchio # oppure crearne uno snapshot." if [ $DAY_OF_MONTH == 01 ] then echo "" ERASE else echo "" CHECK fi
Commenti
Inviato da Suse98 il Lun, 16/05/2011 - 15:11.
Re: Script per sincronizzare i dati della home su uno o più ...
Non riesco a capire come funziona...
Non sono pratico di script...
HP - Gaming OMEN 15-ek0015nl Notebook
Intel Core i7-10750, Nvidia GeForce RTX 2060 6GB, 32GB RAM, 500GB SSD M2 + 2TB Sabrend SSD M2
Inviato da wal7er il Mer, 01/06/2011 - 09:45.
Re: Script per sincronizzare i dati della home su uno o più ...
L'idea e buona ma c'è già rsync che, oltre ad effettuare sincronizzazioni in remoto, funziona con directory locali.
In questo modo non ti devi preoccupare di fare tutto a mano (creazione/controllo directory, controllo esistenza files, ecc...).
HP Pavilion dv5-1110el powered by OpenSUSE 13.2 64bit
http://linuxcounter.net/cert/432576.png