Newsgroup: it.arti.cinema
Titolo: ELPH Joe - giglio - Red -  Barry / Linux - Shell Scripts - Nerd

Aiut!
Ho un hard-disk HD1 con migliaia di files (tipo ~500Gb in tutto)
sparsi in varie directory, tutti con la stessa estensione ext1, del
tipo:
437.4336.543.ext1
957.6485.987.ext1
...
Vorrei fare uno script processa tutti 'sti files, uno alla volta,
cosi':
1) Trasferisce un file da HD1 ad un altro HD2 (rimuovendolo da HD1).
2) Esegue un mio programma che genera un altro file 437.4336.543.ext2
3) Trasferisce il nuovo file (ext2) in HD1 (rimuovendolo da HD2).
4) Goto 1 con un nuovo file.
Non ci sono altri file in HD1, a parte quelli che devo processare.
Il problema e' questi files sono tutti sparsi in varie sotto-
directory, per cui non so come fare per trasferirli. Immagino potrei
fare una lista specifica contenente tutti i files e i loro percorsi
(salvata in un file a parte) ma non sono abbastanza nerd per questi
virtuosismi.. come si puo' fare 'sta lista in maniera automatica? E
come si puo' impostare lo shell script?

                 -- Kirk, "The Corbomite Maneuver" (TOS), data astrale 1514.0



io lo farei con perl più o meno con questa logica:
- creazione di una funzione1 che riceve come argomento un path ad un file 
e: 
	1 sposta il file da un percorso(HD1) all'altro(HD2)
	2 esegue il programma generando il nuovo file
	3 lo sposta al path originario su HD1
- creazione di una funzione2 che riceve come argomento una directory e:
	1 inserisce il contenuto in un array
	2 lo scandisce e: 
		a se trova un file lo passa a funzione1
		b se trova una directory richiama se stessa (intesa come 
			funzione) con la directory stessa come argomento
poi: &funzione2("directoryIniziale");

 virtuosismi.. come si puo' fare 'sta lista in maniera automatica?
find . -name \*.ext1 -print > lista
 > E come si puo' impostare lo shell script?
Sicuramente si possono fare le cose in maniera sofisticata,
soprattutto se hai bisogno di rimettere ciascun file nella stessa
directory di HD1, ma con bash è una martellata nei coglioni
(bisognerebbe creare appunto la lista, poi usare awk per costruire la
medesima struttura directory in HD2 e poi copiare tutto nuovamente in
HD1).
Forse si fa prima a imparare due rudimenti di perl :) ma io non ne ho
voglia.
--
Joe

 find . -name \*.ext1 -print > lista
questo e' molto utile, grazie.


Ops, leggo solo adesso.
potrebbe funzionare questo:
find . -name \*.ext1 -exec programma \{\} \; -a -exec rm \{\} \;
dovrebbe agire su un file per volta, trasformandolo con 'programma' e
poi rimuovendolo.
Però assicurati prima che funzioni su un gruppo di file, facendone una
copia ad esempio su HD2.
--
Joe

 copia ad esempio su HD2.
Naa, lo provero' direttamente su tutti i files.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ? Dico bene? Ma come fare MyScript?
a questo punto MyScript.sh dovrebbe contenere semplicemente i comandi:
#!/bin/sh
programma $1 && rm $1
Quel "&&" sta per AND e sta ad indicare che MyScript.sh procede alla
rimozione del file (rm $1)  solo se l'operazione precedente è andata a
buon fine.
Ma tutto dipende sempre dalla capacità di 'programma' di generare un
codice d'errore in caso di fallimento.
--
Joe

 buon fine.
Ok. Non saprei come faccia lo script a sapere che l'operazione "e'
andata a buon fine" (se intendi solo dire che "programma" e' stato
eseguito, allora credo che MyScript sia equivalente alla tua "seconda"
soluzione).

 soluzione).
Come dicevo sopra, i comandi, gli script e alcuni programmi scritti
appositamente per girare in una shell lasciano alla fine un 'exit
status' cioè un valore da 0 a 255 che indica successo o fallimento.
In questo caso se l'exit status è diverso da 0 lo "&&"  (AND) dovrebbe
saltare l'operazione successiva (cioè la rimozione del file). Quindi
lo script si conclude e find lo riesegue di nuovo sul file seguente.
--
Joe

 orrenda sintassi di find.
Elegantissima, opto per questa. Dunque:
find . -name \*.ext1 -exec programma \{\} \; -a -exec rm \{\} \;
Mi pare di capire che il simbolo \{\} passato come argomento
rapperesnta il nome completo del file. Operando cosi' si produrrebbe
il nuovo file con stesso nome (ma con estensione ext2) nella stessa
directory del vecchio file.
Ma io vorrei che nuovi files vadano tutti nello stesso posto (cosi'
poi piallo tutte le altre directory). Immagino che dopo aver
processato tutti i files bastera' spostarli con qualcosa tipo:
find . -name \*.ext1 -exec mv \{\} \; /nuovo/pattern/.
Va bene cosi'? O devo mettere anche il "-a" da qualche parte (dove?)?
Oppure (massimo dell'eleganza) si possono fare entrambe le cose in un
colpo solo?
Tipo cosi':
find . -name \*.ext1 -exec programma \{\} \; -a -exec rm \{\} \; -a -
exec mv \{\} \; /nuovo/pattern/.
...funziona??

 ...funziona??
Questo non dovrebbe funzionare perché \{\} (tra l'altro non ho mai
capito perché non usare semplicemente {}) espande il pattern trovato
all'inizio, cioè il file .ext1, quindi ti dirà "file inesistente"
perché è stato rimosso.
--
Joe

 perché è stato rimosso.
Giusto. L'argomento di mv dovrebbe essere di estensione ext2, (per il
resto stesso nome del vecchio ext1). Come fare?

 resto stesso nome del vecchio ext1). Come fare?
Mah, forse con le regex si può isolare il nome del file senza
estensione in modo da mettere (faccio un esempio, non ricordo
assolutamente come funzionano le regex) al posto di
rm \{\}
rm $1.ext1
e al posto di
mv \{\}
mv $1.ext2
ma di sicuro non funziona così. Non so se e come si possono utilizzare
le regex all'interno di find per estrarre solo una sottostringa dal
nome del file, metterla in una variabile e usarla subito dopo. Forse
costruendo una pipe con awk, ma non credo e non so se ne valga la
pena.
--
Joe

 assolutamente come funzionano le regex) al posto di
Ahi, questo e' troppo difficile per me :)
Dato che non sono presenti altri files ext2 nell'HD, pensavo che forse
si potrebbe inserire il secondo "find" (quello che cerca gli ext2 e li
piazza /dove/voglio/io) come argomento dentro il primo "find" (quello
che converte), qualcosa tipo (i -a sono messi a caso):
find . -name \*.ext1 -exec programma \{\} \; -a -exec rm \{\} \; -a -
exec find . -name \*.ext2 -exec mv \{\} /dove/vuoi/tu/ \;
che pero' e' un tantino ricorsivo, non so se funzionerebbe.

 che pero' e' un tantino ricorsivo, non so se funzionerebbe.
Non credo, però al posto dell'ultimo -a puoi mettere:
&& find . -name \*.ext2 -exec mv \{\} /dove/vuoi/tu/ \;
però alla fine è come eseguire i due comandi di fila.
--
Joe

 mecojoni...
...finito. Grazie, le tue preziose soluzioni hanno funzionato a dovere.


 ...finito. Grazie, le tue preziose soluzioni hanno funzionato a dovere.
             /|
       __/ |__
__ /          _)
     |          _)    a Joe Silver piace questo elemento.
__|          _)
    \____ _)
--
Joe