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... \:D/
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:

Codice: Seleziona tutto

for file in ${PREFIX}*
con:

Codice: Seleziona tutto

for file in $(ls -1 ${PREFIX}*)
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)

Codice: Seleziona tutto

PREFIX="/home/alutri/.freeguide/day-"
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)

Codice: Seleziona tutto

PREFIX="/home/alutri/.freeguide/day-"
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