Benvenuto Visitatore ( Log In | Registrati )
![]() ![]() |
28 Jun 2008, 02:01
Messaggio
#1
|
|
|
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 -------------------- |
|
|
|
|
|
|
|
28 Jun 2008, 12:42
Messaggio
#2
|
|
|
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:
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. -------------------- Marco Coïsson
http://homepage.mac.com/marco_coisson L'atomo divisibile: podcast gratuito di divulgazione scientifica. X come Macintosh |
|
|
|
|
28 Jun 2008, 17:18
Messaggio
#3
|
|
|
mille grazie marco
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... -------------------- |
|
|
|
|
29 Jun 2008, 02:50
Messaggio
#4
|
|
|
-------------------- Marco Coïsson
http://homepage.mac.com/marco_coisson L'atomo divisibile: podcast gratuito di divulgazione scientifica. X come Macintosh |
|
|
|
|
29 Jun 2008, 19:28
Messaggio
#5
|
|
|
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. -------------------- Marco Coïsson
http://homepage.mac.com/marco_coisson L'atomo divisibile: podcast gratuito di divulgazione scientifica. X come Macintosh |
|
|
|
|
26 Jul 2008, 18:25
Messaggio
#6
|
|
|
È 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 -------------------- |
|
|
|
|
![]() ![]() |
| Titolo discussione | Risposte | Autore discussione | Visite | Ultima azione | |||
|---|---|---|---|---|---|---|---|
![]() |
32 | Biba | 1.191 | Ieri, 17:43 Ultimo messaggio di: Biba |
|||
![]() |
5 | Tevac | 1.213 | Ieri, 16:35 Ultimo messaggio di: murpy |
|||
![]() |
5 | area00 | 87 | 26 November 2008 - 11:48 Ultimo messaggio di: sirguich_ |
|||
![]() |
4 | bacillino80 | 62 | 25 November 2008 - 00:28 Ultimo messaggio di: bacillino80 |
|||
![]() |
141 | Italo | 3.721 | 23 November 2008 - 23:58 Ultimo messaggio di: massimiliano amadori |
|||
![]() |
6 | ryosaeb4 | 126 | 20 November 2008 - 20:54 Ultimo messaggio di: Max31055 |
|||
![]() |
0 | carlerchemez | 65 | 17 November 2008 - 23:18 Ultimo messaggio di: carlerchemez |
|||
![]() |
0 | ryosaeb4 | 63 | 17 November 2008 - 11:32 Ultimo messaggio di: ryosaeb4 |
|||
![]() |
8 | pulce15 | 112 | 13 November 2008 - 16:32 Ultimo messaggio di: chebfarid |
|||
![]() |
0 | Trystero | 72 | 2 November 2008 - 01:10 Ultimo messaggio di: Trystero |
|||
![]() |
10 | ---io--- | 260 | 1 November 2008 - 03:57 Ultimo messaggio di: Biba |
|||
![]() |
12 | maurizione | 117 | 31 October 2008 - 11:43 Ultimo messaggio di: maurizione |
|||
|
Versione Lo-Fi | Oggi è il: 2 December 2008 - 08:31 |
| IP.Board Skin Developed By Creative Networks | ||