Backup solo se… esercizio in bash – 3

n1

Continuo da qui.
Se i file da copiare fossero tutti nella stessa directory lo script sarebbe qualcosa di simile a questo:

#!/bin/bash

function terpri() {
    echo -e copio \"$1\" "in" \"$2\"
}

ORIG=("f-1"
      "f-2-piccolo"
      "f1-3"
      "f1 4"
      "f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    D=$DEST${ORIG[${i}]}
    terpri "$O" "$D"
done

t2

Notare che per adesso i file non vengono copiati, sono ancora in fase di prototipo.
In realtà i file si trovano in cartelle diverse per cui lo script va modificato; la directory di destinazione è invece unica, per comodità.

#!/bin/bash

function terpri() {
    echo -e copio \"$1\" "in" \"$2\"
}

ORIG=("./orig1/f-1"
      "./orig1/f-2-piccolo"
      "./orig2/f1-3"
      "./orig3/f1 4"
      "./orig3/f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    N=$(basename "$O")
    D=$DEST$N
    terpri "$O" "$D"
done

t3

OK, ma OK, avete ragione, si può evitare una riga e una variabile:

#!/bin/bash

function terpri() {
    echo -e copio \"$1\" "in" \"$2\"
}

ORIG=("./orig1/f-1"
      "./orig1/f-2-piccolo"
      "./orig2/f1-3"
      "./orig3/f1 4"
      "./orig3/f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    D=$DEST$(basename "${ORIG[${i}]}")
    terpri "$O" "$D"
done

Ho dovuto proteggere con virgolette il valore in basename() –cosa che si rende necessaria perché ormai dobbiamo rassegnarci agli spazi nei nome dei file ma rende nervoso il mio pupil (peraltro ottimo).

Beh direi che si sono, ecco la versione definitiva:

#!/bin/bash

function copia() {
    S="$1"
    D="$2"
    echo $S
    if [[ -e $S ]] ; then
        NC=$(wc -c "$S")
        ND=${NC%% *}
        if [[ $((ND > 7)) == 1 ]] ; then
            echo $'\t' copio $S in $D
            cp "$S" "$D"
        fi
    fi
}

ORIG=("./orig-1/f-1"
      "./orig-1/f-2-piccolo"
      "./orig-2/f1-3"
      "./orig-3/f1 4"
      "./orig-3/f2-4 manca"
     )

DEST="./dest/"

for (( i=0; i < ${#ORIG[@]}; i++ )); do
    O=${ORIG[${i}]}
    D=$DEST$(basename "${ORIG[${i}]}")
    copia "$O" "$D"
done

tag

Lo script può essere facilmente modificato per funzionare a rovescio, ripristinare i file precedentemente salvati. Troppo facile, lasciato come esercizio.
Un’altra cosa da prevedere (era una delle richieste) è di accodare ai file aggiunte memorizzate temporaneamente in un’altra locazione, p.es. su un drive USB. Cosa semplice, ricorrendo a cat con >> come potete verificate con man cat. E la storia della pipe ormai dovreste conoscerla, ne ho parlato spesso, è una delle cose più belle introdotte da Unix.

Però –sì c’è un però: quando G. (chissà se entrerà nel team degli autori o si farà un blog tutto suo?) ha visto che la programmazione bash non era così immediata e che poi comunque non avrebbe funzionato con Windows mi ha proposto una proposta più che sensata. Cosa che vedremo la prossima puntata. Prossimamente, forse 😀

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: