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.
samiel
Staff
Staff
Messaggi: 5510
Iscritto il: ven gen 16, 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

Messaggioda samiel » gio feb 25, 2016 1:52

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: 12954
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: Aiuto per semplice script bash

Messaggioda conraid » gio feb 25, 2016 7:43

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: 5510
Iscritto il: ven gen 16, 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

Messaggioda samiel » gio feb 25, 2016 15:32

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: 6469
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per semplice script bash

Messaggioda targzeta » gio feb 25, 2016 20:52

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

samiel
Staff
Staff
Messaggi: 5510
Iscritto il: ven gen 16, 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

Messaggioda samiel » ven feb 26, 2016 20:43

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: 6469
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per semplice script bash

Messaggioda targzeta » ven feb 26, 2016 21:14

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

samiel
Staff
Staff
Messaggi: 5510
Iscritto il: ven gen 16, 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

Messaggioda samiel » sab feb 27, 2016 14:36

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

grazie
m

Avatar utente
Linpassion
Linux 2.0
Linux 2.0
Messaggi: 164
Iscritto il: mar ott 30, 2012 11:17
Slackware: 14.0
Kernel: 3.2.9-smp
Desktop: fluxbox

Re: Aiuto per semplice script bash

Messaggioda Linpassion » lun lug 18, 2016 16:11

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

samiel
Staff
Staff
Messaggi: 5510
Iscritto il: ven gen 16, 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

Messaggioda samiel » mar lug 19, 2016 10:04

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