Aiuto per semplice script bash

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Aiuto per semplice script bash

Messaggio da samiel »

Ho uno script che mi fa il backup di svariate directory su una chiavetta USB, ma volevo perfezionarlo in modo che raccogliesse le directory di origine come subdirectory di directory principali. Forse la cosa risulta più chiara se inserisco lo script che non funziona:

Codice: Seleziona tutto

#!/bin/bash
USER=`whoami`
mkdir -p /media/$USER/CORSAIR/samiel/
mkdir -p /media/$USER/CORSAIR/fonts/
mkdir -p /media/$USER/CORSAIR/slackware/
mkdir -p /media/$USER/CORSAIR/software/
SOURCE=( ~/.abook ~/.vimrc ~/argomentare ~/articoli ~/bibliografie ~/cataloghi )
TARGET="/media/$USER/CORSAIR/samiel/"
SOURCE=( /mnt/archive/fonts )
TARGET="/media/$USER/CORSAIR/fonts/"
SOURCE=( /mnt/archive/software )
TARGET="/media/$USER/CORSAIR/software/"
date=`date "+%y-%M-%D"` # %H_%M per avere anche l'orario
# Tag dei log scritti in /var/log/messages
TAG="backup_full"
rsync -rvuz --delete --delete-after --progress ${SOURCE[@]} $TARGET
Le directory principali vengono create, ma poi viene effettuato solo il backup dell'ultima.
Si accettano suggerimenti...

grazie
m

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Aiuto per semplice script bash

Messaggio da conraid »

Perché il comando usa solo l'ultima variabile. È come se sovrascrivessi la variabile con un'altra quando la dichiari nuovamente.

O usi qualche ciclo (per esempio numerando le variabili/array e poi un for), oppure semplicemente dopo ogni target fai il sync, tipo

Codice: Seleziona tutto

SOURCE=( ~/.abook ~/.vimrc ~/argomentare ~/articoli ~/bibliografie ~/cataloghi )
TARGET="/media/$USER/CORSAIR/samiel/"
rsync -rvuz --delete --delete-after --progress ${SOURCE[@]} $TARGET
SOURCE=( /mnt/archive/fonts )
TARGET="/media/$USER/CORSAIR/fonts/"
rsync -rvuz --delete --delete-after --progress ${SOURCE[@]} $TARGET
SOURCE=( /mnt/archive/software )
TARGET="/media/$USER/CORSAIR/software/"
rsync -rvuz --delete --delete-after --progress ${SOURCE[@]} $TARGET

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Aiuto per semplice script bash

Messaggio da samiel »

La seconda soluzione è in effetti elementare-
La seconda mi sembra assai più elegante:: ma come dovrei "numerare" le variabili?

grazie
m

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per semplice script bash

Messaggio da targzeta »

Non so se questo funziona ma ti evita anche di crearti prima le directory di destinazione:

Codice: Seleziona tutto

#!/bin/bash
USER=`whoami`

declare -A BACKUP_INFOS
BACKUP_INFOS=(
  [/media/$USER/CORSAIR/samiel/]="~/.abook ~/.vimrc ~/argomentare \
                                  ~/articoli ~/bibliografie ~/cataloghi"
  [/media/$USER/CORSAIR/fonts/]="/mnt/archive/fonts"
  [/media/$USER/CORSAIR/software/]="/mnt/archive/software"
)

for dest_dir in "${!BACKUP_INFOS[@]}"
do
  echo mkdir "$dest_dir"
  src="${BACKUP_INFOS[$dest_dir]}"
  echo rsync $src "=>" "$dest_dir"
done
(ovviamente ci ho messo delle stampe tanto per vedere un po'. I comandi veri devi vederteli tu :))
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Aiuto per semplice script bash

Messaggio da samiel »

Grazie funziona, tranne un dettaglio che non so bene come interpretare.
Tengo i file di script per fare i backup e altri per installare in automatico delle cose
nella directory ~/system_files. Lancio da qui lo script:

Codice: Seleziona tutto

#!/bin/bash
USER=`whoami`

declare -A BACKUP_INFOS
BACKUP_INFOS=(
  [/media/$USER/CORSAIR/samiel/]="/home/samiel/.abook 
  /home/samiel/argomentare /home/samiel/articoli /home/samiel/bibliografie"
#  [/media/$USER/CORSAIR/fonts/]="/mnt/archive/fonts"
  [/media/$USER/CORSAIR/software/]="/mnt/archive/software/epson"
)

for dest_dir in "${!BACKUP_INFOS[@]}"
do
  echo mkdir "$dest_dir"
  src="${BACKUP_INFOS[$dest_dir]}"
  rsync -rvuz --delete --delete-after --progress $src "=>" "$dest_dir"
done
e ottengo

Codice: Seleziona tutto

samiel@darkstar:~/system_files$ bash try.sh 
mkdir /media/samiel/CORSAIR/samiel/
building file list ... 
rsync: link_stat "/home/samiel/system_files/=>" failed: No such file or directory (2)
645 files to consider

sent 14,177 bytes  received 11 bytes  28,376.00 bytes/sec
total size is 24,219,445  speedup is 1,707.04
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]
mkdir /media/samiel/CORSAIR/software/
building file list ... 
rsync: link_stat "/home/samiel/system_files/=>" failed: No such file or directory (2)
15 files to consider
                                                                                                                                                                                                                                            
sent 540 bytes  received 11 bytes  1,102.00 bytes/sec                                                                                                                                                                                       
total size is 2,403,889  speedup is 4,362.77                                                                                                                                                                                                
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]

m

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per semplice script bash

Messaggio da targzeta »

Ma, ovviamente è sbagliato. Io ti avevo passato un echo di esempio quel '=>' non ha senso per rsync :)
Il comando dovrebbe essere:

Codice: Seleziona tutto

rsync -rvuz --delete --delete-after --progress $src "$dest_dir"
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Aiuto per semplice script bash

Messaggio da samiel »

non me n'ero accorto... :(
così mi pare funzioni benissimo

grazie
m

Avatar utente
Linpassion
Linux 2.x
Linux 2.x
Messaggi: 336
Iscritto il: mar 30 ott 2012, 11:17
Slackware: 14.2
Desktop: xfce, fluxbox

Re: Aiuto per semplice script bash

Messaggio da Linpassion »

La butto la! Se nello script comprimi in zip la Homee poi copi il file zip su usb?

samiel
Staff
Staff
Messaggi: 5511
Iscritto il: ven 16 gen 2004, 0:00
Nome Cognome: Mauro Sacchetto
Slackware: 13.0
Kernel: 2.26
Desktop: KDE
Distribuzione: anche Debian
Località: Venezia

Re: Aiuto per semplice script bash

Messaggio da samiel »

Non ho capito bene. comunque in generale sì che puoi comprimere la home e copiarla.
Ma a me interessava un backup selettivo e non compresso, cosi da essere disponibile
subito da qualsiasi PC...

m

Rispondi