[RISOLTO] Aiuto per shell script

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

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.
Avatar utente
Burroughs
Linux 4.x
Linux 4.x
Messaggi: 1076
Iscritto il: mer 15 dic 2004, 0:00
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux
Località: Glasgow
Contatta:

[RISOLTO] Aiuto per shell script

Messaggio 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.
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)

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Aiuto per shell script

Messaggio 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 ;) .

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Aiuto per shell script

Messaggio da conraid »

find -not -name "*.db" -not -name "*.sql"| xargs rm

fai un po' di prove però :-)

Avatar utente
Burroughs
Linux 4.x
Linux 4.x
Messaggi: 1076
Iscritto il: mer 15 dic 2004, 0:00
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux
Località: Glasgow
Contatta:

Re: Aiuto per shell script

Messaggio 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.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Aiuto per shell script

Messaggio 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

Avatar utente
Burroughs
Linux 4.x
Linux 4.x
Messaggi: 1076
Iscritto il: mer 15 dic 2004, 0:00
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux
Località: Glasgow
Contatta:

Re: Aiuto per shell script

Messaggio 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.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: Aiuto per shell script

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per shell script

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Burroughs
Linux 4.x
Linux 4.x
Messaggi: 1076
Iscritto il: mer 15 dic 2004, 0:00
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux
Località: Glasgow
Contatta:

Re: Aiuto per shell script

Messaggio 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.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Aiuto per shell script

Messaggio 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

Avatar utente
Burroughs
Linux 4.x
Linux 4.x
Messaggi: 1076
Iscritto il: mer 15 dic 2004, 0:00
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux
Località: Glasgow
Contatta:

Re: Aiuto per shell script

Messaggio 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.
"Two things are infinite: the universe and human stupidity; and I'm not sure about the universe" (Albert Einstein)

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: Aiuto per shell script

Messaggio 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.

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: Aiuto per shell script

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per shell script

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Aiuto per shell script

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi