Pagina 1 di 2
[RISOLTO] Aiuto per shell script
Inviato: sab 10 dic 2011, 12:24
da Burroughs
Un saluto a tutti!
Volevo chiedervi un aiuto per risolvere il problema che mi si sta presentando all'implementazione di uno shell script.
Lo script in questione esegue una conversione al volo dei miei database MySQL in un formato più digeribile da SQLite, l'applicativo che sono costretto ad usare sul tablet.
Al termine dell'esecuzione, mi ritrovo nella mia
/home una directory con i seguenti file:
Codice: Seleziona tutto
[alutri@andy backup]$ ls -la
totale 401
drwxr-xr-x 2 alutri users 488 10 dic 12.14 .
drwxr-xr-x 4 alutri users 320 10 set 2010 ..
-rw-r--r-- 1 alutri users 7599 10 dic 12.14 Collaborazioni-2011-12-10
-rw-r--r-- 1 alutri users 12288 10 dic 12.14 Collaborazioni-2011-12-10.db
-rw-r--r-- 1 alutri users 5934 10 dic 12.14 Iglug-2011-12-10
-rw-r--r-- 1 alutri users 6144 10 dic 12.14 Iglug-2011-12-10.db
-rw-r--r-- 1 alutri users 2655 10 dic 12.14 Info-2011-12-10
-rw-r--r-- 1 alutri users 4096 10 dic 12.14 Info-2011-12-10.db
-rw-r--r-- 1 root root 278417 8 dic 17.00 mydbs-2011-12-08.sql
-rw-r--r-- 1 alutri users 2619 10 dic 12.14 Networking-2011-12-10
-rw-r--r-- 1 alutri users 4096 10 dic 12.14 Networking-2011-12-10.db
-rw-r--r-- 1 alutri users 27717 10 dic 12.14 Versamenti-2011-12-10
-rw-r--r-- 1 alutri users 48128 10 dic 12.14 Versamenti-2011-12-10.db
Quello che vorrei fare è semplicemente rimuovere tutti i file diversi da quelli con estensione *.db e *.sql, visto che, essendo semplici file di testo, non mi servono una volta spostatomi sul tablet.
Qualche indicazione?
Burroughs.
Re: Aiuto per shell script
Inviato: sab 10 dic 2011, 12:40
da Ansa89
Una cosa tipo questa
Codice: Seleziona tutto
cd dir_backup
for i in `ls` ; do
DB=`echo $i | rev | cut -d "." -f 1 | rev`
SQL=`echo $i | rev | cut -d "." -f 1 | rev`
if [ "$DB" != "db" ] && [ "$SQL" != "sql" ]; then
rm $i
fi
done
L'ho buttato giù un po' velocemente, quindi è meglio se lo controlli bene

.
Re: Aiuto per shell script
Inviato: sab 10 dic 2011, 12:51
da conraid
find -not -name "*.db" -not -name "*.sql"| xargs rm
fai un po' di prove però

Re: Aiuto per shell script
Inviato: dom 11 dic 2011, 10:28
da Burroughs
Grazie per l'aiuto, ragazzi!
Volevo chiedervi, giusto per curiosità: esiste la maniera di avviare uno script in modo tale da eseguirlo ma senza fargli effettuare modifiche reali sul file system?
Burroughs.
Re: Aiuto per shell script
Inviato: dom 11 dic 2011, 10:58
da Ansa89
Invece di "rm", ci metti un "echo":
Codice: Seleziona tutto
cd dir_backup
for i in `ls` ; do
DB=`echo $i | rev | cut -d "." -f 1 | rev`
SQL=`echo $i | rev | cut -d "." -f 1 | rev`
if [ "$DB" != "db" ] && [ "$SQL" != "sql" ]; then
echo "Voglio cancellare $i"
fi
done
Re: Aiuto per shell script
Inviato: lun 12 dic 2011, 17:11
da Burroughs
Ansa89 ha scritto:Invece di "rm", ci metti un "echo": [CUT]
Tutto ok, grazie ansa...
Approfittando della tua disponibilità, volevo sottoporti un altro quesito; uso uno script che mi elenca determinati file in base a date diverse.
Questo è un tipico output:
Codice: Seleziona tutto
[alutri@andy ~]$ ls .freeguide/
day-2011-12-10-D.ser
day-2011-12-11-D.ser day-2011-12-14-C.ser day-2011-12-17-B.ser
day-2011-12-12-A.ser day-2011-12-14-D.ser day-2011-12-17-C.ser
day-2011-12-12-B.ser day-2011-12-15-A.ser day-2011-12-17-D.ser
day-2011-12-12-C.ser day-2011-12-15-B.ser day-2011-12-18-A.ser
day-2011-12-12-D.ser day-2011-12-15-C.ser day-2011-12-18-B.ser
day-2011-12-13-A.ser day-2011-12-15-D.ser day-2011-12-18-C.ser
day-2011-12-13-B.ser day-2011-12-16-A.ser day-2011-12-18-D.ser
day-2011-12-13-C.ser day-2011-12-16-B.ser day-2011-12-19-A.ser
day-2011-12-13-D.ser day-2011-12-16-C.ser iconcache
day-2011-12-14-A.ser day-2011-12-16-D.ser xmltv-configs
day-2011-12-14-B.ser day-2011-12-17-A.ser
Il mio proposito sarebbe quello di lanciare un comando che isola tutti i file (in questo caso uno solo) antecedenti alla data odierna, provvedendo poi a rimuoverli.
Che consigli mi puoi/potete dare?
Burroughs.
Re: Aiuto per shell script
Inviato: lun 12 dic 2011, 17:21
da JohnnyMnemonic
Io li listerei uno per riga ("ls -1") filtrando per day ( grep day) e tagliando la stringa usando i "-" per fare i confronti prima per anno, poi per mese, poi per giorno
Re: Aiuto per shell script
Inviato: lun 12 dic 2011, 20:06
da targzeta
Questo script
bash dovrebbe fare quello che vuoi:
Codice: Seleziona tutto
#!/bin/bash
PREFIX="day-"
DATE=$(date "+${PREFIX}%Y-%m-%d")
# Mi assicuro che esista almeno un file con la data di oggi
FAKE_FILE=""
if ! ls ${DATE}* >& /dev/null
then
# Non esiste, ne creo uno fasullo
FAKE_FILE=$(mktemp ${DATE}.XXXXXX)
fi
for file in ${PREFIX}*
do
if [[ $file != ${DATE}* ]]
then
echo $file
else
break
fi
done
# Elimino l'eventuale file fasullo che ho creato
[[ $FAKE_FILE != "" ]] && rm -f $FAKE_FILE
La bash dovrebbe restituire i file ordinati per nome, se vuoi stare più sicuro puoi sostituire questo:
con:
Emanuele
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 9:41
da Burroughs
spina ha scritto:Questo script bash dovrebbe fare quello che vuoi: [CUT]
Grazie, spina, lo script funziona...

Volevo solo chiederti come faccio a rimuovere i file che mi vengono restituiti dall'output, ovverosia questo:
Codice: Seleziona tutto
[alutri@andy ~]$ ./prova
/home/alutri/.freeguide/day-2011-12-11-D.ser
/home/alutri/.freeguide/day-2011-12-12-A.ser
/home/alutri/.freeguide/day-2011-12-12-B.ser
/home/alutri/.freeguide/day-2011-12-12-C.ser
/home/alutri/.freeguide/day-2011-12-12-D.ser
Burroughs.
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 10:06
da Ansa89
Basta che cambi "echo $file" con "rm $file":
Codice: Seleziona tutto
#!/bin/bash
PREFIX="day-"
DATE=$(date "+${PREFIX}%Y-%m-%d")
# Mi assicuro che esista almeno un file con la data di oggi
FAKE_FILE=""
if ! ls ${DATE}* >& /dev/null
then
# Non esiste, ne creo uno fasullo
FAKE_FILE=$(mktemp ${DATE}.XXXXXX)
fi
for file in ${PREFIX}*
do
if [[ $file != ${DATE}* ]]
then
rm $file
else
break
fi
done
# Elimino l'eventuale file fasullo che ho creato
[[ $FAKE_FILE != "" ]] && rm -f $FAKE_FILE
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 10:18
da Burroughs
Ansa89 ha scritto:Basta che cambi "echo $file" con "rm $file": [CUT]
Ok, tutto chiaro...
Un'ultimissima domanda: sto cercando di adattare questo script ad altre situazioni in cui ho bisogno di effettuare una pulizia simile su file multipli recanti date diverse...
E' possibile includere in questa dichiarazione (perdonatemi la terminologia grossolana)
più argomenti (in modo da cercare più file nella stessa directory, oltre a
day-) e se sì, come?
Burroughs.
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 10:47
da Ansa89
Dovresti fare un array per "PREFIX" e un array per "DATE" e aggiungere un ciclo "for" per scandire ogni elemento dell'array:
Codice: Seleziona tutto
#!/bin/bash
MAX_IDX=2
PREFIX[0]="day-"
PREFIX[1]="pippo-"
PREFIX[2]="pluto-"
for i in `seq 0 ${MAX_IDX}` ; do
DATE[i]=$(date "+${PREFIX[i]}%Y-%m-%d")
done
# Mi assicuro che esista almeno un file con la data di oggi
for i in `seq 0 ${MAX_IDX}` ; do
FAKE_FILE[i]=""
if ! ls ${DATE[i]}* >& /dev/null
then
# Non esiste, ne creo uno fasullo
FAKE_FILE[i]=$(mktemp ${DATE[i]}.XXXXXX)
fi
for i in `seq 0 ${MAX_IDX}` ; do
for file in ${PREFIX[i]}*
do
if [[ $file != ${DATE[i]}* ]]
then
rm $file
else
break
fi
done
# Elimino l'eventuale file fasullo che ho creato
[[ $FAKE_FILE[i] != "" ]] && rm -f $FAKE_FILE[i]
done
Ovviamente qualcuno avrà una soluzione più semplice e concisa della mia.
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 12:02
da masalapianta
find -not -name "day-`date +%Y-%m-%d`-*.ser" -exec rm {} \;
elimina tutti i file del tipo "day-yyyy-mm-dd-*.ser" in cui la data è diversa da quella odierna
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 12:10
da targzeta
Burroughs ha scritto:...
Un'ultimissima domanda: sto cercando di adattare questo script ad altre situazioni in cui ho bisogno di effettuare una pulizia simile su file multipli recanti date diverse...
E' possibile includere in questa dichiarazione (perdonatemi la terminologia grossolana)
più argomenti (in modo da cercare più file nella stessa directory, oltre a
day-) e se sì, come?
Ti ho messo anche un controllo su mktemp: se la creazione del file fasullo non va a buon fine lo script è pericoloso. Inoltre ti ho parametrizzato lo script su PREFIX:
Codice: Seleziona tutto
#!/bin/bash
PREFIX=${PREFIX:-"day-"}
DATE=$(date "+${PREFIX}%Y-%m-%d")
# Mi assicuro che esista almeno un file con la data di oggi
FAKE_FILE=""
if ! ls ${DATE}* >& /dev/null
then
# Non esiste, ne creo uno fasullo
! FAKE_FILE=$(mktemp ${DATE}.XXXXXX) && exit 1
fi
for file in ${PREFIX}*
do
if [[ $file != ${DATE}* ]]
then
echo $file
else
break
fi
done
# Elimino l'eventuale file fasullo che ho creato
[[ $FAKE_FILE != "" ]] && rm -f $FAKE_FILE
Quello che devi fare è semplicemente invocare lo script con un ciclo for:
Codice: Seleziona tutto
for prefix in /home/alutri/.freeguide/day- /home/alutri/.freeguide/casa-
do
PREFIX=$prefix sh script.sh
done
Emanuele
Re: Aiuto per shell script
Inviato: mar 13 dic 2011, 12:15
da targzeta
masalapianta, leggi bene quello che ha chiesto Burroughs.
masalapianta ha scritto:find -not -name "day-`date +%Y-%m-%d`-*.ser" -exec rm {} \;
elimina tutti i file del tipo "day-yyyy-mm-dd-*.ser" in cui la data è diversa da quella odierna
Burroughs ha scritto:...Il mio proposito sarebbe quello di lanciare un comando che isola tutti i file (in questo caso uno solo) antecedenti alla data odierna, provvedendo poi a rimuoverli...
Emanuele