Script Ubuntu - Eliminazione file più vecchi di 30 giorni

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
ARuggeri
Prode Principiante
Messaggi: 24
Iscrizione: martedì 28 gennaio 2014, 16:13
Distribuzione: Ubuntu 14.04.1 LTS x86_64
Località: Tivoli (Rm)
Contatti:

Script Ubuntu - Eliminazione file più vecchi di 30 giorni

Messaggio da ARuggeri »

Salve ragazzi,

mi stavo divertendo un po con gli script ubuntu nome_script.sh scritti in bash.
Il dilemma mi è venuto quando ho provato a fare quanto segue:

Per creare un comando che sia capace di eliminare dei file più vecchi di 30 giorni dentro una directory ho scritto quanto segue:

find /PATH/DELLA/DIRECTROY/ -type D -mtime +30 -exec rm -r {}\;

Ma se allo stesso tempo io vorrei far diventare tale funzione da statica a dinamica ovvero ogni volta che mi parte lo script decido io dove andare a fare le modifiche dovuto.

Per esempio vorrei settare tre variabili dinamiche che mi cambiano all'occorrenza ovvero:

#!/bin/bash

directory=
tipo=
giorni=
comando=

#Con il seguente comando andiamo a eliminare i File's e le Directory presenti dentro la Directory desiderata

#find $directory -type $tipo -mtime $giorni -exec $comando\;



exit 0


come potrei fare???

Grazie.
Ultima modifica di ARuggeri il martedì 18 novembre 2014, 10:45, modificato 1 volta in totale.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: Script Ubuntu

Messaggio da 1001001 »

Ciao!
ARuggeri ha scritto:ogni volta che mi parte lo script decido io dove andare a fare le modifiche
ARuggeri ha scritto:vorrei settare tre variabili dinamiche che mi cambiano all'occorrenza
Non hai spiegato come vuoi fare a settare queste variabili. Vuoi settarle alla chiamata dello script? Vuoi che lo script le deduca da solo in qualche modo a partire (ad esempio) dalle variabili di ambiente? Vuoi che lo script le legga da file?



PS: ricordati di usare i tag code quando inserisci listati in un messaggio. Potresti modificare il tuo post sopra per favore?
"I find your lack of faith disturbing."
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script Ubuntu

Messaggio da rai »

Provo a dare per scontato che quello che vuoi sia
ogni volta che mi parte lo script decido io dove andare a fare le modifiche

Codice: Seleziona tutto

#!/bin/bash

[[ $# -lt 4 || ! -d $1 ]]  && echo -e "Esegue COMMAND su tutti gli elementi di tipo TYPE contenuti in DIR,
\t\tse sono più vecchi di DAYS giorni

USO:\t$(basename "$0") DIR TYPE DAYS 'COMMAND' [1]

\tDIR\tPath in cui iniziare la ricerca
\tTYPE\tTipo di file su cui agire ( vedi: man find )
\tDAYS\tEtà in giorni dei file su cui agire
\tCOMMAND\tStringa tra apici con 'comando --opzioni'
\t1\tOpzione per ricerca NON-ricorsiva. Default: tutte le sub-cartelle
" && exit 2

[[ $5 = 1 ]] && depth="-maxdepth 1"

find $1 $depth -type $2 -mtime +$3 -exec $4 {} \;
questo però non permette di inserire comandi (come p.es. mv) che richiedono un secondo token (nel caso di mv la nuova destinazione/nome)
non che sia impossibile, solo diventa più complicato scrivere la linea di comando e/o parsarla all'interno dello script
ARuggeri
Prode Principiante
Messaggi: 24
Iscrizione: martedì 28 gennaio 2014, 16:13
Distribuzione: Ubuntu 14.04.1 LTS x86_64
Località: Tivoli (Rm)
Contatti:

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da ARuggeri »

Grazie della risposta si bene o male hai centrato il mio problema ovvero vorrei che ogni volta che lo script viene eseguito io sia in grado di cambiare in modo dinamico le variabili non ho bisogno di uno script statico ma dinamico si può fare o è troppo complesso???
Ultima modifica di ARuggeri il martedì 18 novembre 2014, 11:06, modificato 1 volta in totale.
ARuggeri
Prode Principiante
Messaggi: 24
Iscrizione: martedì 28 gennaio 2014, 16:13
Distribuzione: Ubuntu 14.04.1 LTS x86_64
Località: Tivoli (Rm)
Contatti:

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da ARuggeri »

Allora alcune cose mi sono chiare altre meno in quanto sto iniziando da poco a prendere dimestichezza con la programmazione bash:

Codice: Seleziona tutto

(tale campo cosa indica?) [[ $# -lt 4 || ! -d $1 ]] 
(perchè esegui tale comando?) echo -e "Esegue COMMAND su tutti gli elementi di tipo TYPE contenuti in DIR, \t\tse sono più vecchi di DAYS giorni 

#!/bin/bash

[[ $# -lt 4 || ! -d $1 ]]  && echo -e "Esegue COMMAND su tutti gli elementi di tipo TYPE contenuti in DIR,
\t\tse sono più vecchi di DAYS giorni

(con tale campo assegna un comando a una variabile o fa altro?) USO:\t$(basename "$0") DIR TYPE DAYS 'COMMAND' [1]

(in questa sequenza cosa esegue lo script)

\tDIR\tPath in cui iniziare la ricerca
\tTYPE\tTipo di file su cui agire ( vedi: man find )
\tDAYS\tEtà in giorni dei file su cui agire
\tCOMMAND\tStringa tra apici con 'comando --opzioni'
\t1\tOpzione per ricerca NON-ricorsiva. Default: tutte le sub-cartelle
" && exit 2

[[ $5 = 1 ]] && depth="-maxdepth 1"

(qui è più chiaro in quanto lo script esegue il comando desiderato dove le variabile prendono il valore assegnatogli prima ma che non riesco a capire con chiarezza come è stato possibile ovvero $1 $depth $2 $3 $4 dove le vai a dichiarare???)

find $1 $depth -type $2 -mtime +$3 -exec $4 {} \; 
Nell'attesa di novità ti ringrazio per il momento :ciao:
Ultima modifica di ARuggeri il martedì 18 novembre 2014, 11:06, modificato 3 volte in totale.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: Script Ubuntu

Messaggio da 1001001 »

Lascio a rai il compito di spiegare il suo script. Mi limito solo a ricordarti di usare il tag code quando inserisci i listati nei tuoi messaggi, come da regolamento. Ti chiederei inoltre di modificare i tuoi messaggi precedenti per favore.
"I find your lack of faith disturbing."
Avatar utente
jackynet92
Moderatore Globale
Moderatore Globale
Messaggi: 13413
Iscrizione: sabato 3 settembre 2011, 1:41
Desktop: Mate
Distribuzione: Ubuntu 16.04 64bit
Sesso: Maschile
Località: Torino

Re: Script Ubuntu

Messaggio da jackynet92 »

Per postare correttamente i risultati del terminale e/o listati sul forum basta:
  • 1. selezionare il testo del terminale
    2. tasto destro copia (in alternativa premere Ctrl + maiusc + C)
    3. incollare sul forum negli appropriati code, ovvero selezionare il testo e cliccare su Codice

Codice: Seleziona tutto

[color=#FF0000] qui inserisci il testo [/color][ /code]

[code]in modo da ottenere qualcosa di simile
Inoltre metti un titolo meno generico
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da rai »

aspettavo che trovassi il tempo di mettere ordine nel formato dei tuoi post prima di rispondere, non è pignoleria ma solo che ci capiamo meglio se tutti si rispetta lo stesso criterio. P.es. quando rispondi citando (bottom posting) abbi cura di ritagliare solo la parte di citazione a cui stai rispondendo invece di incollare tutto un malloppo :)
Salva tutto il codice dello script in un file di nome p.es. foo, poi esegui

Codice: Seleziona tutto

chmod +x foo
./foo
per vedere meglio cosa fa

$1 $2 ... $N sono parametri posizionali: argomenti che si passano allo script dalla linea di comando e che sono identificati dalla posizione che hanno dopo il nomescript: $1 è la prima stringa che metti , $2 la seconda, $N l'ennesima
$0 è il nome dello script
$* e $@ rappresentano tutte le variabili passate allo script
$# rappresenta il numero di parametri passati

lo script richiede di avere passati quattro parametri obbligatori e uno facoltativo; su questi non fa controlli di congruità salvo i due seguenti:

Codice: Seleziona tutto

[[ $# -lt 4 || ! -d $1 ]] && echo "blabla" && exit 2 

questa riga controlla appunto che il numero di parametri ($#) non sia minore di 4 e che il primo dei parametri ($1) non sia una cartella inesistente. Se anche una sola delle due condizioni è vera, mostra un help ( && echo "blabla" ) ed esce (&& exit 2).
Così com'è l'esempio, quindi sta all'utente curare che l'ordine con cui i parametri vengono passati e la sintassi sia corretta...
Per dettagli ti rimando a:

Codice: Seleziona tutto

man [
man test # che è la stessa cosa
ARuggeri
Prode Principiante
Messaggi: 24
Iscrizione: martedì 28 gennaio 2014, 16:13
Distribuzione: Ubuntu 14.04.1 LTS x86_64
Località: Tivoli (Rm)
Contatti:

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da ARuggeri »

Mi scuso per il disguido di come ho impostato la sezione del forum. Inoltre ti ringrazio della spiegazione che è stata molto chiara ed esaustiva.
Il tuo codice è molto lineare ed esaustivo ti volevo chiedere prendendo spunto da quanto ci siamo detti sono arrivato a questa soluzione secondo te potrebbe andare bene:

Codice: Seleziona tutto

#!/bin/bash

#Con il seguente comando andiamo ad eliminare i File's e le Directory più vecchie di almeno 30 giorni,
#presenti dentro la Directory desiderata con 
find $1 -type $2 -mtime +$3 -exec echo $4 {}\; 

#Per eseguire lo script lanciamo il seguete comando da terminale: 
#./rimuovi.sh $1=/Directory $2=-f $3=30 $4=rm -r

exit 0
Fammi sapere grazie :D
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da difesaparcosempione »

Il parametro -D indicherebbe opzioni nel comando find.
Se ti interessa i file dovresti mettere -f
ciao
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da UbuNuovo »

Visto che Rai non è intervenuto cerco di farti notare quello che non va.
Hai letto la pagina sui parametri posizionali "linkata" da Rai? Pare di no.
I valori dei parametri vengono assegnati automaticamente alle variabili $1, $2...$n , non devi passare le assegnazioni allo script.
non così:

Codice: Seleziona tutto

nome_script.sh $1=xxx $2=yyy $3=zzz $4='aa -bb'
ma così:

Codice: Seleziona tutto

nome_script.sh xxx yyy zzz 'aa -bb'
per esempio:

Codice: Seleziona tutto

./rimuovi.sh /tmp f 30 'rm -r'
Per fare pratica con i parametri passati ad uno script e vedere come viene costruito il comando con find, puoi crearti questo script "elenca_parametri.sh".

Codice: Seleziona tutto

#!/bin/bash
clear
n_par=$#
echo "Sono stati passati $n_par parametri."
echo -e "\nI parametri passati sono: $@\n"

echo -e 'Il comando costruito con \n\n\t"find $1 $depth -type $2 -mtime +$3 -exec $4 {} \;"\nsarà:'
echo -e "\n\tfind $1 $depth -type $2 -mtime +$3 -exec $4 {} \;\n"
echo 'Questi i parametri'
for (( i=1; i <= $n_par; i++ ))
do
	echo "il parametro \$$i è: $1"
	shift
done
# Occhio! Eseguito questo ciclo, con shift, i parametri posizionali andranno persi!
lo esegui passando i parametri di prova, in questo modo:

Codice: Seleziona tutto

./elenca_parametri.sh /tmp f 30 'ls -al'
dovresti ottenere come output:

Codice: Seleziona tutto

Sono stati passati 4 parametri.

I parametri passati sono: /tmp f 30 ls -al

Il comando costruito con 

	"find $1 $depth -type $2 -mtime +$3 -exec $4 {} \;"
sarà:

	find /tmp  -type f -mtime +30 -exec ls -al {} \;

Questi i parametri
il parametro $1 è: /tmp
il parametro $2 è: f
il parametro $3 è: 30
il parametro $4 è: ls -al
Una volta capito il funzionamento puoi modificare lo script aggiungendo nuove funzionalità.
Salva l'Ucraina! 🇺🇦
ARuggeri
Prode Principiante
Messaggi: 24
Iscrizione: martedì 28 gennaio 2014, 16:13
Distribuzione: Ubuntu 14.04.1 LTS x86_64
Località: Tivoli (Rm)
Contatti:

[SOLVE] Script Ubuntu-Eliminazione file più vecchi di 30 gio

Messaggio da ARuggeri »

Grazie ragazzi con il vostro aiuto ho risolto quanto mi serviva se posso chiudo la sezione del forum risolvendolo.

GRAZIE A TUTTI!!!!!
Avatar utente
jackynet92
Moderatore Globale
Moderatore Globale
Messaggi: 13413
Iscrizione: sabato 3 settembre 2011, 1:41
Desktop: Mate
Distribuzione: Ubuntu 16.04 64bit
Sesso: Maschile
Località: Torino

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da jackynet92 »

Se ritieni risolto il problema, modifica il titolo del primo post aggiungendo all'inizio [Risolto].

Se vuoi puoi installare questo script che ti aggiunge un pulsante che ti permette di mettere [Risolto] con un solo click.

Alla prossima :ciao:
ARuggeri
Prode Principiante
Messaggi: 24
Iscrizione: martedì 28 gennaio 2014, 16:13
Distribuzione: Ubuntu 14.04.1 LTS x86_64
Località: Tivoli (Rm)
Contatti:

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da ARuggeri »

No ragazzi purtroppo pensavo di aver risolto ma vorrei implementare il mio script con alcune piccolezze di seguito riporto quello che avevo in mente di fare:

Codice: Seleziona tutto

#!/bin/bash

FINDBIN=/usr/bin/find

if [ -z $1 ]; then
    # Verifica che il parametro sia un percorso esistente, altrimenti deve restituire errore
    # Se percorso valido, valorizzare BEGINDIR con $1
    BEGINDIR=$1
fi

# Imposta la variabile FILETYPE con $2, altrimenti restituisce errore
if [ $2 == 'd' || $2 == 'f' ]; then
    FILETYPE=$2
else
    exit 10;
fi

# Verifica che il terzo parametro sia un numero intero positivo
...
NUMOFDAYS=$3

#Con il seguente comando andiamo ad eliminare i File's e le Directory più vecchi di almeno 30 giorni
$FINDBIN ${BEGINDIR} -type ${FILETYPE} -mtime +${NUMOFDAYS} -exec /bin/rm {}\;

exit 0
L'unica finzione che sono riuscito a terminare è la seconda mentre ho piccole difficoltà sulla prima e la terza cosa mi suggerite?

Grazie e Buon Weekend
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script Ubuntu - Eliminazione file più vecchi di 30 giorn

Messaggio da rai »

la prima condizione deve essere così

Codice: Seleziona tutto

if [ -d $1 ]; then
    BEGINDIR=$1
fi
per il numero naturale farei così:

Codice: Seleziona tutto

re='^[0-9]+$'
if [[ $3 =~ $re ]]; then
    NUMOFDAYS=$3
fi
ma se vuoi che vengano cancellati solo se più vecchi di 30 giorni:

Codice: Seleziona tutto

re='^[0-9]+$'
if [[ $3 =~ $re && $3 -ge 30 ]]; then
    NUMOFDAYS=$3
fi
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot] e 20 ospiti