Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [bash scripting] ricorsione su albero di directory

    Purtroppo mi trovo ad affrontare un progetto dell'uni in bash scripting non avendolo studiato granchè e avendo o due dispensine striminzite del prof.. o pdf in inglese di 500 pagine.. e siccome ho 10 giorni scarsi.. ogni tanto mi trovo a chiedere aiuto anche per cose medio/banali (dopo averci sbattuto un po' la testa ) ^_^

    Il progetto: devo emulare la funzione rsync SOLO nel funzionamento locale (da una dir all'altra) e con alcuni parametri

    Il problema specifico: il problema specifico è che devo copiare file per file perchè devo discriminare la copia di ogni singolo file a seconda di alcuni flag. Ma questo non vi interessa se non per dovere di cronaca.

    Il punto è che ho problemi ad implementare la (mutua) ricorsione quando devo copiare una directory con il suo contenuto

    semplifico all'osso il codice.. la funzione principale è start_copy che riceve dal main una lista di file in cui i primi (di numero imprecisato) sono sorgenti e l'ultimo è la directory di destinazione.

    codice:
    start_copy() {
            dest=${!#} #l'ultimo parametro è la destinazione
    
    	for file in $* #ciclo su tutti i parametri 
    	do
                    #esco dal ciclo quando arrivo all'ultimo
                    #parametro che è uguale alla destinazion
    		if [ $file == $dest ]
    			then break
    		fi
    
                    #dopo vari controlli arrivo al punto
                    #in cui devo copiare
    		if [ -d $file ]
    			then copy_dir $file $dest
    			else copy $file $dest
    		fi			
    	done
    }
    
    copy() {
    #dopo vari controlli copia, se necessario, così
    cp $1 $2/`basename $1`
    }
    
    copy_dir() {
    #dopo vari controlli arrivo qui
    mkdir $2/`basename $1` #crea la dir
    
    #faccio la chiamata ricorsiva passando il contenuto della
    #dir che sto copiando
    start_copy "`ls -x $1` $2/`basename $1`"
    }
    Ora.. dopo mille problemi sono arrivato a questo punto.. che dovrebbe funzionare... ma il problema è che alla seconda chiamata di start_copy (quando a chiamarla è copy_dir) come ultimo parametro (${!#}) mi trovo l'intera lista di parametri e non solo l'ultimo (la destinazione corrente) come mi aspetterei...

    in più mi va in loop... probabilmente proprio per questo errore

    qualcuno è così paziente da aiutarmi a capire dove cacchio sbaglio?

    tnx


  2. #2
    up :disperazione:

  3. #3

  4. #4
    In effetti $dest accumula parametri man mano che chiami start_copy, probabilmente perchè non resetti $dest alla fine del ciclo.
    Prova a settare $dest come variabile locale anteponendo "local":

    codice:
    start_copy() {
            local dest=${!#}
            ....
    }
    NeapoliX GNU/Linux
    "Alla maggior parte della gente piace leggere la propria scrittura e annusare l'odore dei propri peti." (Auden)

  5. #5
    azz.. dici che pur non essendo globale può succedere qualcosa dle genere? che è come le variabili statiche (mi pare) in C? che ad ogni invocazione della funzione conserva la variabile precedente?

    Se qualcuno sa qualcosa di certo confermi o smentisca... nel frattempo appena ho linux sotto mano riprovo.. grazie mille!


  6. #6
    Originariamente inviato da }gu|do[z]{®©
    azz.. dici che pur non essendo globale può succedere qualcosa dle genere?
    Piu` semplicemente (se ben ricordo) tutte le variabili sono globali per default.
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  7. #7

    Re: [bash scripting] ricorsione su albero di directory

    Originariamente inviato da }gu|do[z]{®©
    Il progetto: devo emulare la funzione rsync SOLO nel funzionamento locale (da una dir all'altra) e con alcuni parametri

    Il problema specifico: il problema specifico è che devo copiare file per file perchè devo discriminare la copia di ogni singolo file a seconda di alcuni flag. Ma questo non vi interessa se non per dovere di cronaca.
    Sinceramente io proverei a girare la frittata: prima trovare tutti i file in una determinata directory che rispondono ai requisiti (e find dovrebbe farcela senza problemi), quindi copiarli uno alla volta ricreando gli eventuali sottoalberi.
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  8. #8

    Re: Re: [bash scripting] ricorsione su albero di directory

    Originariamente inviato da Ikitt
    Sinceramente io proverei a girare la frittata: prima trovare tutti i file in una determinata directory che rispondono ai requisiti (e find dovrebbe farcela senza problemi), quindi copiarli uno alla volta ricreando gli eventuali sottoalberi.
    io l'ho impostata così:

    una prima serie di funzioni (che stanno sviluppando quelli che fanno il progetto con me) fa il parsing dei parametri verificando la presenza di alcuni flag e impostando sorgenti e destinazione...

    dopo di che ciclo su tutti i files e a seconda che siano directory link o regular file e a seconda delle opzioni -r -l -L (e altre... tutte uguali a quell di rsync) decido se copiare o meno...

    ho capito che tu dici che potrei escludere a priori tutte le directory e/o i link se non devo copiarli.. ma rsync credo faccia come faccio io perchè quando incontra file da non copiare scrive "skipping directory xyz" o qualcosa dle gener.. e non lo scrive prima di iiziare la copia ma durante.. preferisco attenermi ad rsync visto che il prof dice che deve essere il più simile possibile


    Ti ringrazio per l'altro suggerimento.. sta cosa delle variabili globali per default mi suona abbastanza nuova... anzi s enon erro in qualche dispensa si fa il classico esempio con la var con lo stesso nome fuori e dentro la funzione per far vedere che hanno contenuti diversi.. boh..

    indago al più presto, intanto vi ringrazio


  9. #9

    Re: Re: Re: [bash scripting] ricorsione su albero di directory

    Originariamente inviato da }gu|do[z]{®©
    [...]Ti ringrazio per l'altro suggerimento.. sta cosa delle variabili globali per default mi suona abbastanza nuova... anzi s enon erro in qualche dispensa si fa il classico esempio con la var con lo stesso nome fuori e dentro la funzione per far vedere che hanno contenuti diversi.. boh..
    codice:
    #!/bin/sh
    
    foo() {
            VAR1="pippo"
            echo "in foo: VAR1=$VAR1"
    }
    
    bar() {
            local VAR2="pluto"
            echo "in bar: VAR2=$VAR2"
    }
    
    echo "VAR1=$VAR1"
    foo
    echo "VAR1=$VAR1"
    
    echo "VAR2=$VAR2"
    bar
    echo "VAR2=$VAR2"
    codice:
    $ sh test.sh
    VAR1=
    in foo: VAR1=pippo
    VAR1=pippo
    VAR2=
    in bar: VAR2=pluto
    VAR2=
    $
    [edit] fornito esempio migliore [/edit]
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  10. #10
    mi fido.. anche perchè tu sarai sulla bash ed io al momneto no..

    però mi suona strano.. controllerò

    per il momento ti rigrazio.. certo che se è quello da un lato sono sollevato, dall'altro sbatto la capa nel muro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.