
Backup facili anche dalla Shell
Tenere una copia di riserva dei file più importanti è il primo passo per garantire la sicurezza del sistema. Ecco come farlo con un solo comando
(pagina 4 di 4)
tar cvzf ${archivio}.tar.gz $(find ${path}
-type f -mtime ${giorni})
Questo utilizza una sostituzione di comando per convertire l’output
del programma find in una lista da passare al comando tar.
Sfortunatamente, però, questo non funziona con i file il cui nome
contiene uno spazio: lo spazio, infatti, è utilizzato dalla shell per
separare le parole e, quindi, uno spazio nel nome di un file viene
interpretato erroneamente. Ad esempio, se avessimo un file
con nome “nuovo report.odt” e cercassimo di copiarlo con il
comando
cp nuovo report.odt /media/disk
otterremmo un messaggio di errore, dovuto al fatto che la shell si
aspetta di dover copiare i due file “nuovo” e “report.odt” nella
directory indicata. Quando si utilizza il comando find, quindi, è
necessario tenere sempre presente che file contenenti spazi nel
nome non verranno trattati in modo normale.
Fortunatamente esiste un modo piuttosto semplice per aggirare
il problema con eleganza. In pratica, utilizzando l’opzione
-print0 del comando find i nomi dei file trovati vengono separati
non con uno spazio, ma con un carattere invisibile che
corrisponde a alla stringa “\0”, e che è il carattere che il linguaggio
C utilizza per terminare le stringhe. L’output di find
così formattato può poi essere processato dal comando xargs,
che di default non fa altro che concatenare tutte le righe in input
in un unica riga, ma che con l’opzione -0 (attenzione, è uno
zero, non una “o”maiuscola) separa i vari nomi non basandosi
sugli spazi. Le opzioni del comando tar sono: “c” che crea un
nuovo archivio, “v” che stampa a video le operazioni eseguite,
“z” che crea un archivio compresso, “f” pone l’archivio nel file
specificato, nel nostro caso ${backup_file}.
[19-24] Con queste
righe diamo all’utente la possibilità di salvare il backup anche
in remoto; dobbiamo, quindi, distinguere tra le destinazioni per
decidere quale programma utilizzare per la copia: “cp” per una
copia locale e “scp” per una copia remota. Il metodo utilizzato
per prendere la decisione è basato sul fatto che gli indirizzi remoti
sono dati nella forma utente@macchina:path, dove però
la parte relativa all’utente è opzionale (se è lo stesso sulle due
macchine); ciò che identifica sicuramente un indirizzo remoto è
quindi la presenza dei due punti, cercati tramite il programma
grep.
[25] A questo punto viene invocato il programma di copia,
salvato nella variabile ${copy}, con i parametri rappresentati
dal file di backup creato alla riga 18 e la destinazione fornita
dall’utente sulla riga di comando.
 |
Backup della directory corrente e salvataggio in una cartella remota |