IPB     Il futuro di Tevac dipende da te!  

Benvenuto Visitatore ( Log In | Registrati )

C'è un Contest da votare, Fallo ora!!

  · · · · · · · · · · · ·
Reply to this topicStart new topic
> Script per cancellare parecchi file ad una condizone.., (mi serve un aiutino..)
Roberto Rota
messaggio 28 Jun 2008, 02:01
Messaggio #1


V-Strommer
Gruppo icone

Gruppo: Root Admin
Messaggi: 12.780
Iscritto il: 14-May 03
Da: Vignola (MO)
Utente Nr.: 2



Mi trovo con una macchina linux che devo liberare da una marea di file, ma con un certo metodo...
provo a spiegare:

ho tre cartelle:

/var/lib/cartella1/
/var/lib/cartella2/
/var/lib/cartella3/

entrambe hanno diverse sottocartelle, tutte uguali e parecchi file.
se un file è presente in una sottocartella della cartella1, è presente nella stessa sottocartella della cartella2 e della cartella 3

In alcuni casi però nella cartella3 (sempre quella) non c'è, e allora devo eliminare tutti e due gli altri.

In sostanza se mi ritrovo con una situazione del genere

/var/lib/cartella1/sub/file
/var/lib/cartella2/sub/file
/var/lib/cartella3/sub/file

lo script deve ignorare quel file e passare agli altri, ma se invece la situazione è

/var/lib/cartella1/sub/file
/var/lib/cartella2/sub/file
/var/lib/cartella3/sub/

allora lo script deve cancellare i file /var/lib/cartella1/sub/file e /var/lib/cartella2/sub/file

e passare al prossimo file.

In parole povere, lo script deve fare un elenco dei file contenenti nella cartella (e sottocartelle) cartella1
verificare che lo stesso file sia presente nella stessa posizione della cartella3
se c'è bene, ma se non cè deve cancellare il file della cartella1 e quello della cartella2 nella stessa posizione.

Mi ci sto rovinando la notte... qualcuno mi aiuta?

tnx in advance icon_wink.gif




--------------------
Go to the top of the page
 
+Quote Post
Marco Coïsson
messaggio 28 Jun 2008, 12:42
Messaggio #2


life, n: a whim of several billion cells to be you for a while
***********

Gruppo: Supporter
Messaggi: 9.327
Iscritto il: 18-May 03
Da: Torino
Utente Nr.: 65



Ho preparato questo scriptino in Perl:
CODE
#!/usr/bin/perl

$percorso_base=@ARGV[0];
$cartella_riferimento=@ARGV[1];
$cartella_confronto=@ARGV[2];

chdir $percorso_base;
$mancanti=`diff -r $cartella_riferimento $cartella_confronto`;
@tutte_cartelle=<*>;

@linee=split /\n/,$mancanti;

foreach $linea(@linee)
{
    $nome_file=(split /:\s/,$linea)[1];
    ((split /:\s/,$linea)[0]) =~ /Only\sin\s(.*)/;
    $percorso=$1;
    
    @componenti=split/\//,$percorso;
    
    foreach $cartella(@tutte_cartelle)
    {
        $da_cancellare=$cartella . "/";
        for($i=1;$i<@componenti;$i++)
        {
            $da_cancellare=$da_cancellare . $componenti[$i] . "/";
        }
        $da_cancellare=$da_cancellare . $nome_file;
        
        `rm $da_cancellare` if -e $da_cancellare;
    }
}

Lo salvi col nome che vuoi, e gli dai i permessi di esecuzione: chmod +x nomescript.
Lo invochi dalla shell con la seguente sintassi:
CODE
./nomescript /percorso/cartella/base sottocartella_riferimento sottocartella_confronto

dove:
  • /percorso_cartella_base è il path relativo o assoluto della cartella di partenza: nel tuo caso /var/lib
  • sottocartella_riferimento è il percorso relativo a quello base della cartella di riferimento: nel tuo caso cartella1
  • sottocartella_confronto è il percorso relativo a quello base della cartella di confronto: nel tuo caso cartella3

Lo script (l'ho testato su OSX, ma tutto ciò di cui fa uso dovrebbe esserci anche su Linux) non tiene correttamente conto di file nascosti (come i .DS_Store), che comunque su Linux non dovresti avere; quando ne trova, anziché cancellarli, cerca di cancellare la cartella che li contiene, ma il comando rm non ci riesce e genera errore (che ti ritrovi sulla finestra della shell), ma lo script prosegue coi file successivi.

Non l'ho provato molto, quindi fossi in te io prima gli farei fare un giro su una cartella "sicura" dove non possa fare danni. icon_wink.gif


--------------------
Marco Coïsson
http://homepage.mac.com/marco_coisson

L'atomo divisibile: podcast gratuito di divulgazione scientifica.

X come Macintosh, la nuova serie
Nel numero di ottobre: No, tu no; Ancora Fusion; Podcast anch'io.
Go to the top of the page
 
+Quote Post
Roberto Rota
messaggio 28 Jun 2008, 17:18
Messaggio #3


V-Strommer
Gruppo icone

Gruppo: Root Admin
Messaggi: 12.780
Iscritto il: 14-May 03
Da: Vignola (MO)
Utente Nr.: 2



mille grazie marco icon_biggrin.gif

nel frattempo è comparso il nostro "Capitan Ventosa" (indovina chi?) di tevac, sembra che abbia un radar a fiutare i problemi, che ha realizzato a tempo di record uno script che ha risolto la situazione....

Il tuo script comunque nel frattemo l'ho provato e sembra funzionare, magari torna utile anche ad altri

grazie infinite per essere accorso in soccorso... icon_biggrin.gif


--------------------
Go to the top of the page
 
+Quote Post
Marco Coïsson
messaggio 29 Jun 2008, 02:50
Messaggio #4


life, n: a whim of several billion cells to be you for a while
***********

Gruppo: Supporter
Messaggi: 9.327
Iscritto il: 18-May 03
Da: Torino
Utente Nr.: 65



icon_biggrin.gif Sono sicuro che il nostro "Capitan Ventosa" avrà fatto come di consueto un ottimo e tempestivo lavoro! icon_biggrin.gif Visto che comunque il mio script c'è e pare funzionare, ora che l'urgenza è passata magari mi metto lì e lo commento, così può tornare utile anche didatticamente. icon_wink.gif Magari domani, quando sono un po' più sveglio. icon_wink.gif


--------------------
Marco Coïsson
http://homepage.mac.com/marco_coisson

L'atomo divisibile: podcast gratuito di divulgazione scientifica.

X come Macintosh, la nuova serie
Nel numero di ottobre: No, tu no; Ancora Fusion; Podcast anch'io.
Go to the top of the page
 
+Quote Post
Marco Coïsson
messaggio 29 Jun 2008, 19:28
Messaggio #5


life, n: a whim of several billion cells to be you for a while
***********

Gruppo: Supporter
Messaggi: 9.327
Iscritto il: 18-May 03
Da: Torino
Utente Nr.: 65



Qualche commento, caso mai lo script dovesse tornare utile ad altri (o anche solo per imparare qualche cosa di nuovo):
CODE
#!/usr/bin/perl

La solita shebang per informare la shell che si tratta di uno script Perl.

CODE
$percorso_base=@ARGV[0];
$cartella_riferimento=@ARGV[1];
$cartella_confronto=@ARGV[2];

I tre argomenti di invocazione vengono messi in variabili con nomi che ne identificano il ruolo.

CODE
chdir $percorso_base;

Ci spostiamo nella cartella dalla quale parte tutto, così da aver a che fare solo con percorsi relativi.

CODE
$mancanti=`diff -r $cartella_riferimento $cartella_confronto`;

Inutile reinventare la ruota: il comando diff del terminale non confronta solo file, ma anche intere cartelle, e dice quali file sono presenti in una ma non in un'altra. L'output viene dirottato sulla variabile $mancanti.

CODE
@tutte_cartelle=<*>;

Serve anche sapere quali sottocartelle ci sono nella cartella da cui tutto parte, perché oltre a quella di riferimento, e oltre a quella di confronto, ce ne potrebbero essere delle altre.

CODE
@linee=split /\n/,$mancanti;

L'output di diff è formattato su più linee, una linea per file; le separiamo con split, così che nell'array risultante ci sia il nome di ogni file mancante (nella cartella di confronto) in ogni elemento.

CODE
foreach $linea(@linee)

Quindi iteriamo su tutti i nomi di file mancanti.

CODE
{
    $nome_file=(split /:\s/,$linea)[1];

La linea di output ritornata da diff non è così seplice: c'è del testo all'inizio, un segno di due punti e quindi il nome del file mancante, che mettiamo in una variabile.

CODE
    ((split /:\s/,$linea)[0]) =~ /Only\sin\s(.*)/;
    $percorso=$1;

Il nome del file non basta: se la cartella di partenza è divisa in una struttura ad albero articolata, è necessario conoscere il percorso del file mancante, per evitare di cancellare file con lo stesso nome che stanno in percorsi diversi e che invece non vanno cancellati.

CODE
    @componenti=split/\//,$percorso;

Un percorso è fatto di vari componenti, separati da delle slash; li estraiamo.

CODE
    foreach $cartella(@tutte_cartelle)

Ora andiamo in ogni sottocartella della cartella di partenza.

CODE
    {
        $da_cancellare=$cartella . "/";

Iniziamo a costruire il percorso complessivo di ogni file da cancellare.

CODE
        for($i=1;$i<@componenti;$i++)
        {
            $da_cancellare=$da_cancellare . $componenti[$i] . "/";
        }

Tale percorso è costituito aggiungendo tutte le componenti precedentemente estratte, tranne la prima, dal momento che dobbiamo iterare su tutte le sottocartelle di quella principale, e non solo su quella di riferimento.

CODE
        $da_cancellare=$da_cancellare . $nome_file;

Per finire, aggiungiamo al percorso il nome effettivo del file da cancellare.

CODE
        `rm $da_cancellare` if -e $da_cancellare;
    }
}

Non ci resta che cancellare detto file.

Buon divertimento. icon_wink.gif


--------------------
Marco Coïsson
http://homepage.mac.com/marco_coisson

L'atomo divisibile: podcast gratuito di divulgazione scientifica.

X come Macintosh, la nuova serie
Nel numero di ottobre: No, tu no; Ancora Fusion; Podcast anch'io.
Go to the top of the page
 
+Quote Post
poweruser
messaggio 26 Jul 2008, 18:25
Messaggio #6


MacInATopic
Gruppo icone

Gruppo: Root Admin
Messaggi: 24.318
Iscritto il: 27-July 03
Da: Maglie (LE)
Utente Nr.: 440



È passato un po' di tempo e non trovo più lo script che ho dato al boss.
Il funzionamento si basava sulle named pipe. Il processo find trovava i risultati e li scriveva nella pipe; un secondo processo leggeva i percorsi dei file dalla pipe, faceva i controlli del caso e operava di conseguenza.

Ciao
Paolo


--------------------
Paolo Portaluri

guru, n: A computer owner who can read the manual.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic

 

Collapse

> 

    Titolo discussione Risposte Autore discussione Visite Ultima azione
No New Posts   6 alcina 146 Ieri, 11:08
Ultimo messaggio di: pphoto
No New Posts   1 arbushell 64 6 October 2008 - 22:27
Ultimo messaggio di: Bhoo!
No new   47 Italo 2.233 6 October 2008 - 18:36
Ultimo messaggio di: Italo
No New Posts   3 finalcut 156 3 October 2008 - 20:31
Ultimo messaggio di: finalcut
No New Posts   4 Ferex 201 3 October 2008 - 12:56
Ultimo messaggio di: Ferex
No New Posts 3 Marco Yahoo 116 1 October 2008 - 12:36
Ultimo messaggio di: Marco Yahoo
No New Posts   0 TevacPhoto 30 28 September 2008 - 22:58
Ultimo messaggio di: TevacPhoto
No new   10 zack77 122 21 September 2008 - 20:14
Ultimo messaggio di: Biba
No New Posts   8 mauhey 98 20 September 2008 - 16:22
Ultimo messaggio di: mauhey
No New Posts   8 ---io--- 154 14 September 2008 - 11:54
Ultimo messaggio di: Biba
No New Posts   1 sisco 110 11 September 2008 - 23:37
Ultimo messaggio di: poweruser
No New Posts   5 kop 109 9 September 2008 - 14:27
Ultimo messaggio di: poweruser

Modalità di visualizzazione: Normale · Passa a: Lineare · Passa a: Outline


RSS Versione Lo-Fi Oggi è il: 14 October 2008 - 18:43
IP.Board Skin Developed By Creative Networks