Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
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:
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.
Ultima modifica di Burroughs il mar 13 dic 2011, 22:18, modificato 1 volta in totale.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)
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.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)
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:
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.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)
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
#!/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:
#!/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
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)
#!/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.
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:...
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:
#!/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:
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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama