Repository 32bit  Forum
Repository 64bit  Wiki

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

[RISOLTO] Aiuto per shell script

Messaggioda Burroughs » sab dic 10, 2011 12:24

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 dic 13, 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
Burroughs
Linux 2.6
Linux 2.6
 
Messaggi: 968
Iscritto il: mer dic 15, 2004 0:00
Località: Lago Patria (NA)
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux

Re: Aiuto per shell script

Messaggioda Ansa89 » sab dic 10, 2011 12:40

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
Ansa89
Iper Master
Iper Master
 
Messaggi: 2623
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: Aiuto per shell script

Messaggioda conraid » sab dic 10, 2011 12:51

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

fai un po' di prove però :-)
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Aiuto per shell script

Messaggioda Burroughs » dom dic 11, 2011 10:28

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
Burroughs
Linux 2.6
Linux 2.6
 
Messaggi: 968
Iscritto il: mer dic 15, 2004 0:00
Località: Lago Patria (NA)
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux

Re: Aiuto per shell script

Messaggioda Ansa89 » dom dic 11, 2011 10:58

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
Ansa89
Iper Master
Iper Master
 
Messaggi: 2623
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: Aiuto per shell script

Messaggioda Burroughs » lun dic 12, 2011 17:11

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
Burroughs
Linux 2.6
Linux 2.6
 
Messaggi: 968
Iscritto il: mer dic 15, 2004 0:00
Località: Lago Patria (NA)
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux

Re: Aiuto per shell script

Messaggioda JohnnyMnemonic » lun dic 12, 2011 17:21

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
JohnnyMnemonic
Staff
Staff
 
Messaggi: 2732
Iscritto il: sab set 04, 2004 23:00
Località: Bologna
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos

Re: Aiuto per shell script

Messaggioda targzeta » lun dic 12, 2011 20:06

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Aiuto per shell script

Messaggioda Burroughs » mar dic 13, 2011 9:41

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
Burroughs
Linux 2.6
Linux 2.6
 
Messaggi: 968
Iscritto il: mer dic 15, 2004 0:00
Località: Lago Patria (NA)
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux

Re: Aiuto per shell script

Messaggioda Ansa89 » mar dic 13, 2011 10:06

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
Ansa89
Iper Master
Iper Master
 
Messaggi: 2623
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: Aiuto per shell script

Messaggioda Burroughs » mar dic 13, 2011 10:18

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
Burroughs
Linux 2.6
Linux 2.6
 
Messaggi: 968
Iscritto il: mer dic 15, 2004 0:00
Località: Lago Patria (NA)
Nome Cognome: Andrea Lutri
Kernel: 3.16.0
Desktop: KDE SC 4.13.3
Distribuzione: Arch Linux

Re: Aiuto per shell script

Messaggioda Ansa89 » mar dic 13, 2011 10:47

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
Ansa89
Iper Master
Iper Master
 
Messaggi: 2623
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: Aiuto per shell script

Messaggioda masalapianta » mar dic 13, 2011 12:02

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
masalapianta
Iper Master
Iper Master
 
Messaggi: 2775
Iscritto il: dom lug 24, 2005 23:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: Aiuto per shell script

Messaggioda targzeta » mar dic 13, 2011 12:10

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Aiuto per shell script

Messaggioda targzeta » mar dic 13, 2011 12:15

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Prossimo

Torna a Gnu/Linux in genere

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti