lunedì 19 gennaio 2015

Script cpMvBar

Da tempo ...
mi ritrovo ...
MALEDUCATO!!!
Ops ... ciao a tuttiii!!! :)

Di nuovo alle prese con una soluzione che ho voluto trovare, ad un problema ... pressoché inutile,
ma insomma che può almeno risparmiare un po' di stress quando si copiano file di notevoli dimensioni da terminale.

Non capita tutti i giorni sì (forse) ... ma proprio la scorsa settimana il mio capo e mi dice ...

Aldo non è possibile che non fai aggiornamenti del OS (windows) nella tua macchina virtuale!!!!
:OOOOO :( ...

Ehm ... sì li faccio ... ....
Mi tocca fare il backup de 59 gb de macchina virtuale?!!
Direi proprio che non ci sia altra scelta :/ ...
Chiaramente nautilus, bello figo ecc ... ma in termini di prestazioni e task aperti (almeno per la mia routine) non è che sia il massimo.
Come sempre c'è il nostro fido terminale, ma lo sappiamo che fare un cp/mv (copia / muovi .. :P ) da terminale di file grandi significa che bisogna ipotizzare quale sia la percentuale di progresso dell'operazione  copia/spostamento  ... :/ .

Qui ci vuole una barra di scorrimento per capire a che punto sta :) ! ...
Invece di affidarmi all'utility zenity come feci in passato che utilizza una gui grafica,
ho optato per uno script, chiaramente open source che permette di mostrare l'avanzamento della copia tramite una barra in caratteri ASCII ... il progetto, nello specifico lo potete trovare a questo indirizzo : http://www.theiling.de/projects/bar.html .

Non mi soffermo sul codice dello script, anche perché non è in bash e non essendo un mostro non ho le competenze per farlo, piuttosto mi soffermerò sulla sintassi della funzionalità principale.
Tale funzionalità si discosta un po'  dal cp in bash, e quindi ho preferito, realizzare uno script apposito per richiamarla.

Lo script non ha veramente niente di sofisticato, si tratta di gestire ... tramite un Case sul primo parametro passato (l'opzioni  -f, -F, -m e -M ) il tipo di operazione deve essere svolta.

Allo stato attuale, non utilizzo il richiamo alla funzione di copia directory, perché poco pratica (accennerò in breve il perché).

Comunque la barra che verrà mostrata in fase di copia sarà questa


Allora vediamo come copiare un file...
ah dimenticavo ... premetto che effettuo richiamo in modo diretto lo script "bar" ... perché spostato in /usr/bin
(ormai abitudine presa per tutti gli script fatti in casa e non che uso frequentemente).

sintassi :

bar -o $fileDestinazione $fileOrigine

Già si nota la prima differenza, la destinazione viene prima e il file di origine dopo.
Fin qui non sarebbe male, se non fossse che ... si deve specificare il file di destinazione e non la cartella, pertanto se si vuole spostare il file "lista.txt" nella cartella "liste" si dovrà eseguire così il comando:

bar -o liste/lista.txt lista.txt


Già questo, almeno per me, risulta un pò antipatico ...

Come dicevo, esiste anche l'opzione per la copia di una directory,
la sintassi

bar -c 'cat > cartella/${bar_file}' file1 file2 file3


(deduco che si sia capito, che lo script non fa altro che effettuare il cat delle operazioni)

Proprio per la copia di una directory devo lavorarci (tempo permettendo ... e solita poca pratica) ancora di più, per ora mi sono limitato a ciclare i soli files di una directory e copiarli uno per uno,
ma proprio perché sono cosciente essere una soluzione poco agevole e sicuramente da cambiare/migliorare, neanche la descrivo.

Allora iniziamo con la copia di un file, rendendo la copia più simile al cp classico.

Nel nostro script che come da titolo nominerò cpMvBar, gestirò diverse opzioni,
per la copia appunto sono due : "-f" e "-F" .

la sintassi nel primo caso sarà

cpMvBar -f $fileOrigine $fileDestinazione 

come si evince ... in realtà in questo caso non faccio assolutamente niente se non invertire l'ordine dei parametri, pertanto, il nome del file deve essere scritto anche nel secondo
Esempio:

cpMvBar -f lista.txt liste/lista.txt


la sintassi nel caso di parametro -F invece, sarà la seguente

cpMvBar -F $fileOrigine $cartellaDestinazione

questo è chiaramente come il comando cp (con in aggiunta l'opzione -F).

pertanto

cpMvBar -F lista.txt liste (nome directory senza il carattere slash finale "/")

per la copia ok.

Il comando bar, aimè non prevede lo spostamento, ma chiaramente ... se fossero questi i problemi :D ;) .

Come per la copia gestisco due casi con le opzioni -m e -M, anche in questo caso, nella prima opzione si deve specificare anche il nome del
file nella destinazione, mentre nel secondo no


cpMvBar -m lista.txt liste/lista.txt

cpMvBar -M lista.txt liste



in questi due ultimi casi non ho fatto altro che richiamare lo script bar, al solito modo, e aggiungere il classico rm successivamente.

Vi riporto di seguito l'intero script :


#! /bin/bash
#cpMvBar Script


while test -n "$1"
do
    case "$1" in
        -m)
              bar -o "$3" "$2"
             
rm "$2"
             
break
         ;;
         -M)

              bar -o "$3/$2" "$2"
             
rm "$2"
             
break
          ;;
          -f)
              bar
-o "$3" "$2"
             
break
           ;;
           -F)
              bar
-o "$3/$2" "$2"
             
break
           ;;
           -h) 

               echo 'Uso: copia [-f] [-d] [-h]'
               
echo 'Options:'
               
echo ' -h mostra questo help'
               echo ' -f copia il file'
               echo ' esempio copia -f fileOrigine fileDestinazione'
               echo ' -F copia il file'
               echo ' esempio copia -f fileOrigine cartellaDestinazione'
               echo ' -m sposta il file'
               echo ' esempio copia -m fileOrigine fileDestinazione'
               echo ' -M sposta il file'
               echo ' esempio copia -m fileOrigine cartellaDestinazione'
               break
             ;;
             *)
               echo
"opzione non gestita"
               break
             ;;
        esac

done



Una volta salvato come cpMvBar (o il nome che volete ... potete anche non omettere l'estensione .sh, ma in tal caso dovrete richiamarlo includendola)

una volta salvato in una directory a piacimento rendiamolo eseguibile con

chmod +x cpMvBar

se lo vogliamo lasciare in questa directory per eseguirlo occorre digitare
./cpMvBar ....

altrimenti possiamo, come nel mio caso aggiungerlo agli script eseguibili di ubuntu su /usr/bin

sudo cp cpMvBar /usr/bin

Chiaro? No? ...
Ah no ... se avrete già curiosato nel link dello script, noterete in realtà che bar non è un semplice script copia incolla, ma contiene, diverse funzionalità tutte da scoprire tra cui per esempio, menziono la barra di scorrimento in fase di compressione/decompressione file...

Questo è quanto ... (appunto il capo me chiama :/)
c.you soon