Pagina 1 di 1

script per shell

MessaggioInviato: 21 lug 2006, 19:03
di `knives`
pensavo.... perchè non imbastiamo un piccolo tutorial sullo script per shell linux e creiamo un piccolo archivio dei nostri script che abbiamo scritto?

per esempio.. io ora sto scrivendo uno script che ricerca i file duplicati in una o piu cartelle

Codice: Seleziona tutto
#!/bin/bash/
FILE_MD5SUM=elenco_md5sum;
FILE_DOPPI=elenco_doppi;
path=${1-"`pwd`/"};
for file in *
do
md5sum "$path""$file"
done | sort >> "$FILE_MD5SUM"

if [ "$a" ==  "$b" ]
then
   rm

exit 0;




come si vede non è finito. mi manca la parte piu difficile.. cioè l'eliminazione dei file ridondanti.
io pensavo di farlo cosi:

mi creo l'elenco di tutti i file presenti nella cartella, per ogniuno calcolo il suo md5sum e lo salvo in un file, ovviamente.. calcolando md5sum i file possono avere nomi diversi.. estensioni diverse.. ma se sono identici i valori del md5, i file sono identici, quindi.. elimino tutti i file tranne uno per ogni file.

la parte facile l ho scritta, quella difficile è eliminare tutte i file ridondanti tranne 1, ma come fare per fare questo?
pensavo.. se io lavoro sul file, mi creo un secondo file dove scrivo tutti i file stando attento che ci siano una sola volta, e dopo di che cancello tutto quello che è rimasto li.

che ne pensate?

MessaggioInviato: 21 lug 2006, 21:03
di `knives`
Codice: Seleziona tutto
#!/bin/bash/
FILE_UNICI=elenco_unici;
FILE_DOPPI=elenco_doppi;
FILE_INDICE=elenco_somma_filename;
FILE_ELIMINARE=elenco_da_eliminare;

path=${1-"`pwd`/"};
for file in *
do
md5sum "$path""$file"
done | sort >> "$FILE_INDICE"
#num_file="cat $FILE_INDICE |wc -l"
cut -b 1-32 $FILE_INDICE >> $FILE_DOPPI;
uniq $FILE_DOPPI $FILE_UNICI;
diff $FILE_DOPPI $FILE_UNICI >> $FILE_ELIMINARE

exit 0;


per oggi mi fermo qui. ovviamente chi ha una partizione di linux lo puo provare.. e vedere cosa fa, basta copiare questo testo incollarlo in un file di testo e rinominarlo in .sh e poi dalle proprieta del file, dargli i permessi di esecuzione.


ps. sarebbe interessante se chi ha una qualunque distro di linux installata, funzionante e utilizzata.. posti qualche idea su cui lavorare, se ne ha bisogno ovvio :)

MessaggioInviato: 22 lug 2006, 00:57
di `knives`
Codice: Seleziona tutto
#!/bin/bash/
FILE_UNICI=elenco_unici;
FILE_DOPPI_MD5SUM=elenco_doppi_md5sum;
FILE_INDICE=elenco_somma_filename;
FILE_ELIMINARE=elenco_da_eliminare;
FILE_DOPPI_FILENAME=elenco_doppi_filename;
APPOGGIO=appoggio;

path=${1-"`pwd`/"};
for file in *
do
md5sum "$path""$file"
done | sort >> "$FILE_INDICE"
#num_file="cat $FILE_INDICE |wc -l"
cut -b 1-32 $FILE_INDICE >> $FILE_DOPPI_MD5SUM;
cut -b 35-200 $FILE_INDICE >> $FILE_DOPPI_FILENAME;
uniq $FILE_DOPPI_MD5SUM $FILE_UNICI ;
diff $FILE_UNICI $FILE_DOPPI_MD5SUM  >> $FILE_ELIMINARE;
cut -b 3-35 $FILE_ELIMINARE >> $APPOGGIO;
rm $FILE_ELIMINARE;
cat $APPOGGIO >> $FILE_ELIMINARE;

exit 0;


questo qui è quasi completo.. mi manca solo di riuscire a risalire al nome del file, per fare questo, devo confrontare ogni linea del file elenco_da_eliminare con elenco_somma_filename, ogni volta che trova una stringa uguale.. mi restituisce il percorso del file cosi da cancellarlo.
e passa al prox...

solo che non so codificarla questa cosa qui :lol:

MessaggioInviato: 22 lug 2006, 13:42
di Ghost
bellina come idea, appena torno di nuovo con linux (hdd troppo piccolo) vedo di buttare giù qualcosa ank'io ^_^

MessaggioInviato: 22 lug 2006, 14:41
di `knives`
Codice: Seleziona tutto
#!/bin/bash/
FILE_UNICI=elenco_unici;
FILE_DOPPI_MD5SUM=elenco_doppi_md5sum;
FILE_INDICE=elenco_somma_filename;
FILE_ELIMINARE=elenco_da_eliminare;
FILE_DOPPI_FILENAME=elenco_doppi_filename;
APPOGGIO=appoggio;

path=${1-"`pwd`/"};
for file in *
do
md5sum "$path""$file"
done | sort >> "$FILE_INDICE"
#num_file="cat $FILE_INDICE |wc -l"
cut -b 1-32 $FILE_INDICE >> $FILE_DOPPI_MD5SUM;
#cut -b 35-200 $FILE_INDICE >> $FILE_DOPPI_FILENAME;
uniq $FILE_DOPPI_MD5SUM $FILE_UNICI ;
diff $FILE_UNICI $FILE_DOPPI_MD5SUM  >> $FILE_ELIMINARE;
cut -b 3-35 $FILE_ELIMINARE >> $APPOGGIO;
rm $FILE_ELIMINARE;
cat $APPOGGIO >> $FILE_ELIMINARE;
rm $APPOGGIO
vettore_md5sum_eliminare=( `cat $FILE_ELIMINARE` )
conta_elementi=${#vettore_md5sum_eliminare[@]}
echo $conta_elementi
i=0;
for i in $conta_elementi;
do
   grep ${#vettore_md5sum_eliminare[i]} $FILE_INDICE >> $APPOGGIO;
   i=$((i+1));
done
cut -b 35-300 $APPOGGIO >> $FILE_DOPPI_FILENAME
mkdir doppi
#vettore_doppi_filename=(`cat $FILE_DOPPI_FILENAME`)
j=1;
for file in *;
do
   strings $FILE_DOPPI_FILENAME >> vettore_doppi_filename[$j]
#   mv "" "$path"doppi/;
   j=$((j+1));
done
exit 0;


okkkk cè l ho fatta!

cioè.... non mi libera spazio.. xo è in grado di riempire tutto il disco di schifezze, si ok.. doveva fare il contrario.. vah beh.. lo usero come virus.. :lol:
son contento che la mia idea sia piaciuta.. solo che.. o tutti han gia i programmi pronti.. o nessuno usa linux :lol:

MessaggioInviato: 22 lug 2006, 17:42
di cb_123
Penso la seconda che hai detto. :lol:

Ma non sei riuscito a far cancellare i file doppi?

MessaggioInviato: 22 lug 2006, 18:00
di `knives`
cb_123 ha scritto:Penso la seconda che hai detto. :lol:

Ma non sei riuscito a far cancellare i file doppi?

no..
devo trovare il comando giusto.. o riuscire a passare un file alla volta agli argomenti del mv

MessaggioInviato: 22 lug 2006, 21:42
di thrantir
ottima idea... appena ricollego i neuroni do un'occhiata allo script :D

MessaggioInviato: 23 lug 2006, 14:32
di Ghost
`knives` ha scritto:cioè.... non mi libera spazio.. xo è in grado di riempire tutto il disco di schifezze, si ok.. doveva fare il contrario.. vah beh.. lo usero come virus.. :lol:

spettacolo [bigsmile]

MessaggioInviato: 24 lug 2006, 23:32
di `knives`
Codice: Seleziona tutto
#!/bin/bash/
FILE_UNICI=elenco_unici;
FILE_DOPPI_MD5SUM=elenco_doppi_md5sum;
FILE_INDICE=elenco_somma_filename;
FILE_ELIMINARE=elenco_da_eliminare;
FILE_DOPPI_FILENAME=elenco_doppi_filename;
APPOGGIO=appoggio;

path=${1-"`pwd`/"};
`cd $path`
rm $FILE_UNICI $FILE_DOPPI_MD5SUM $FILE_INDICE $FILE_ELIMINARE $APPOGGIO $FILE_DOPPI_FILENAME;
rm doppi;
for file in *
do
md5sum "$path""$file"
done | sort >> "$FILE_INDICE"
#num_file="cat $FILE_INDICE |wc -l"
cut -b 1-32 $FILE_INDICE >> $FILE_DOPPI_MD5SUM;
#cut -b 35-200 $FILE_INDICE >> $FILE_DOPPI_FILENAME;
uniq $FILE_DOPPI_MD5SUM $FILE_UNICI ;
diff $FILE_UNICI $FILE_DOPPI_MD5SUM  >> $FILE_ELIMINARE;
cut -b 3-35 $FILE_ELIMINARE >> $APPOGGIO;
rm $FILE_ELIMINARE;
cat $APPOGGIO >> $FILE_ELIMINARE;
rm $APPOGGIO
vettore_md5sum_eliminare=( `cat $FILE_ELIMINARE` );
conta_elementi=${#vettore_md5sum_eliminare[*]};
#echo $conta_elementi;
i=0;
for i in $conta_elementi;
do
   grep ${#vettore_md5sum_eliminare[i]} $FILE_INDICE >> $APPOGGIO;
   i=$((i+1));
done
conta_elementi=0;
cut -b 35-300 $APPOGGIO >> $FILE_DOPPI_FILENAME
mkdir doppi
vettore_doppi_filename=( `cat $FILE_DOPPI_FILENAME` );
conta_eliminare=${#vettore_doppi_filename[*]};
echo $conta_eliminare
i=0;
#for i in $conta_eliminare;
#do

while[ "$i" -le "$conta_eliminare" ]
do
   echo "$i";
   i=$((i+1));
done
exit 0;


devo pensarci su.. non riesco a completarlo.. questo qui è quasi completo.. ormai l'elenco è creato.. mi basterebbe riuscire a cancallare i file(nel mio caso spostarli nella cartella doppi)