Ho iniziato da poco a programmare in bash script e trovo ancora dei problemi con i comandi find e grep. Devo fare un comando che fa dei confronti su due cartelle. Per esaminare se i file della prima cartella esistono nella seconda e se non esistono copiarli faccio, dopo due cicli for che mi aprono rispettivamente la prima e la seconda cartella:

if [[ find $dir2 -name "$file_name_dir1" ]]; then  
    cp $file1 $dir2

dove dir2 è il pathname della mia seconda directory file_name_dir1 è la variabile dove sono memorizzati i nomi dei file presenti nella prima cartella file1 è la variabile del primo ciclo for e dove sono memorizzati i file della prima cartella. Andando ad eseguirlo mi da che l'istruzione dentro if è sbaglia, e ho provato con grep e in altri modi ma mi da sempre lo stesso errore. Spero che riuscite a darmi una mano! grazie in anticipo

Edit

è un compito e sinceramente mi interessa capire come funziona che ci ho perso molto tempo non trovando una soluzione.

#TESTO DELL'ESERCIZIO:
#        Si realizzi uno script bash che implementi un comando "aggiorna" che
#        accetta due parametri.
#        I due parametri devono essere pathname (assoluti o relativi) di due directory.
#        Le due directory non devono essere una contenuta nell'altra (direttamente
#        o indirettamente). Inoltre i due pathname non devono essere link simbolici.
#        Lo script verifica questi requisiti. Se i requisiti non sono soddisfatti
#        stampa un messaggio di errore.
#        Se tutti i requisiti sono soddisfatti, allora il comando esamina tutti i file
#        regolari contenuti nella prima directory e verifica se esistono nella seconda.
#        Se un file non esiste lo copia. Se invece esiste, verifica se quello nella
#        prima directory sia piu' recente; in tal caso lo copia, altrimenti no.
#        (Notare che le copie avvengono solo in una direzione: un contenuto della
#        prima directory viene salvato nella seconda, ma non il contrario)

#PARTE FACOLTATIVA (chi vuole puo' realizzare una versione del comando che accetta una 
#            tutte due queste opzioni:
#
#        -r  se indicata opera ricorsivamente (quindi processa anche
#            le sotto-directory, le sotto-sotto-directory, ecc)
#
#        -i  se indicata opera come descritto ma prima di copiare un file chiede 
#            all'utente se vuole copiarlo o no

#!bin/bash
echo "Questo comando confronta due directories e il loro contenuto."
echo "Inserire il primo nome di una directory: "
read directory1
dir1=$(sudo find $HOME -name "$directory1")
echo "$dir1"
echo "Inserire il secondo nome di una directory: "
read directory2
dir2=$(sudo find $HOME -name "$directory2")
echo "$dir2"
if [[ ! -d $dir1 || ! -d $dir2 ]]; then
    echo "ERRORE: uno dei due nomi non è una directory."
else
    if echo "$dir1" | grep -q "$dir2" || echo "$dir2" | grep -q "$dir1" ; then
            echo "ERRORE: una delle due directory è una sotto-directory."
        else
            if [[ -h $dir1 || -h $dir2 ]]; then
                echo "ERRORE: una delle due directory è un link simbolico."
            else
                for file1 in $dir1/*; do
                    name_file_dir1=$(basename $file1)
                    for file2 in $dir2/*; do
                        name_file_dir2=$(basename $file2)
                        if [ -f "$file1" ]; then
                            if [[ find $dir2 -name "$name_file_dir1" ]]; then
                                if [[ $file1 -nt $file2 ]]; then
                                    cp -r -i $file1 $dir2
                            else
                                cp -r -i $file1 $dir2
                                fi
                            fi
                        fi
                    done
                done
            fi
        fi
fi

chiesto 08 Nov '14, 11:34

trip93's gravatar image

trip93
19224

modificato 08 Nov '14, 13:59

enzotib's gravatar image

enzotib ♦♦
14.0k112186

@trip93: dovresti modificare la domanda aggiungendo alcune informazioni, le risposte alle seguenti domande:

  • questo è un compito a casa o è una cosa che stai tentando di fare per tuo divertimento?
  • ti interessa solo una soluzione che funzioni o ti interessa il procedimento?
  • qual è il testo completo ed esatto dello script che stai usando e come lo invochi?
  • qual è l'errore completo ed esatto che ti dà quando lo esegui?
(08 Nov '14, 13:02) enzotib ♦♦ enzotib's gravatar image

@trip93: avevo detto di modificare la domanda, non di scrivere una risposta: le risposte servono per proporre soluzioni.

(08 Nov '14, 14:00) enzotib ♦♦ enzotib's gravatar image

lo so scusa ma visto che per risponderti interamente alle domande che mi hai fatto (punto 3) non mi bastavano le parole allora ho risposto così almeno è più completo. comunque l'errore che mi da è alla riga postata all'inizio e mi dice: atteso operatore condizionale, errore di sintassi vicino a "$dir2" ed infine mi riporta la riga dell'if.

(08 Nov '14, 14:46) trip93 trip93's gravatar image

si grazie mille infatti così funziona. Comunque mi sono accorto di un'altra cosa: non riesco a capire perchè non riesco a fare questa cosa verifica se quello nella prima directory sia piu' recente; in tal caso lo copia, altrimenti no. con questo pezzo

if [[ find $dir2 -name "$name_file_dir1" ]]; then
    if [[ $file1 -nt $file2 ]]; then
        cp -r -i $file1 $dir2
(08 Nov '14, 15:26) trip93 trip93's gravatar image

@trip93: stai di nuovo usando find dentro [[ ]].
Per quanto riguarda la prima domanda, trasformo il mio commento in risposta, così puoi accettarla in modo da segnalare come risolta la discussione.

(08 Nov '14, 15:39) enzotib ♦♦ enzotib's gravatar image

@trip93: non puoi mettere find dentro [[ ]]. Al limite puoi fare

if find qualcosa; then
    comando
fi

intendendo che se find termina con successo (senza errori) allora viene eseguito il contenuto dell'if.

coll. permanente

ha risposto 08 Nov '14, 15:01

enzotib's gravatar image

enzotib ♦♦
14.0k112186

modificato 08 Nov '14, 15:40

La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×93
×49

domanda posta: 08 Nov '14, 11:34

domanda visualizzata: 1,021 volte

ultimo aggiornamento: 08 Nov '14, 15:40

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.