Newsgroup: it.comp.os.linux.iniziare
Titolo: Cancellare dati più "vecchi" di una settimana

Salve,
 
tramite crontab dovrei cancellare tutti i dati di una directory 
(comprese subdirectory) più vecchi di una settimana, per far ciò ho 
provato con:
 
root@Server01:/home/ipcam# find /home/ipcam/* -mtime +7 -delete
root@Server01:/home/ipcam# ls
20170407  20170409  20170411  20170413  20170415  20170417  20170419
20170408  20170410  20170412  20170414  20170416  20170418  test
root@Server01:/home/ipcam#
 
Come vedete ho ancora le directory del 7 di aprile mentre dovrei avere 
quelle dal 12 ad oggi...
 
Saluti.
GabrieleMax


Come vediamo hai delle directory che si chiamano 7-13 aprile... non che 
sono immutate da quella data....
 
 
detto questo, devi usare il segno meno : -mtime -7

> detto questo, devi usare il segno meno : -mtime -7
 
root@Server01:/home/gabriele# find /home/ipcam/* -mtime -7 -delete
root@Server01:/home/gabriele#
root@Server01:/home/gabriele# cd /home/ipcam/
root@Server01:/home/ipcam# ls
root@Server01:/home/ipcam#
 
Cosi' facendo mi ha cancellato tutto...
 


non lo metto in dubbio, se prima avevi eseguito :
 
find /home/ipcam/* -mtime +7 -delete
 
e dopo :
 
find /home/ipcam/* -mtime -7 -delete
 
 
il risultato è l'insieme vuoto :)

 il risultato è l'insieme vuoto :)
 
scusami , il risultato è :
 
 
find /home/ipcam/* -mtime 7 
 
 
che evidentemente non avevi


Corrisponde la data nel nome con la
data di (ultima) modifica?
 
Forse era meglio un "ls -l"...
 
Infine, perche` usare "-delete", fai
semplicemente un "find ..." e vedi
cosa trova.
E` piu` facile fare il testing.
 
Se funziona, aggiungi "-delete".
 
bye,
 
-- 
 
piergiorgio

 detto questo, devi usare il segno meno : -mtime -7
 
Il segno è giusto, con -7 gli dici tutti gli elementi con mtime più giovane di
7 giorni
 
Enrico


Il comando:
$ find /home/ipcam/* -mtime +7 -delete
non cancellerà mai le directories di primo livello sotto /home/ipcam
 
Per ottenere quello che vuoi ti serve (nota che ho tolto /* dal percorso 
di start per find):
$ find /home/ipcam -mtime +7 -delete
 
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 Enrico
 
Saluti.
GabrieleMax
 

 Giovanni
 
Saluti!
GabrieleMax

On 2017-04-19 21:10, GabrieleMax wrote:

Mi e` venuto un dubbio pero`.
 
Supponiamo si abbia qualcosa come:
 
a/x
 
Cioe` folder "a" con file "x", magari vecchi di 10
giorni *entrambi*.
 
Cosa succede, dal punto di vista del mtime di "a",
se si cancella "x"?
 
Potrei pensare che questo mtime diventi *adesso*,
cioe` adesso si e` modificato "a" (cancellando "x").
 
Quindi, chiaramente, il folder non viene cancellato
(nel caso di "-mtime +7), perche` non ha piu` un
mtime di 10 giorni, bensi` di 0.
 
Quindi, forse, sarebbe meglio qualcosa come:
 
find . -depth -mtime +7 -print0 | xargs -0 -- rm -rf
 
Attenzione al "-rf", potrebbe essere molto
pericoloso, specie se usato da root.
 
In alternativa, bisogna, direi, farsi uno script
che scelga tra "rm -f" e "rmdir".
 
bye,
 
-- 
 
piergiorgio

 bye,
 
Saluti!
GabrieleMax
 

 accadere! :D
 
Allora, ho fatto una prova, e "find" risulta
scaltro abbastanza da costruire prima la lista
e poi eseguire il "-delete", quindi cancella
anche il folder ("a", in questo esempio).
 
Il problema e` quello che Giovanni ha gia`
indicato, cioe`:
 
find /home/ipcam/* ...
 
Equivale a:
 
find /home/ipcam/2014xxx /home/ipcam/2015yyy ...
 
Cioe` "*" viene espanso (da shell) e` "find"
cerca _dentro_ quei folder (che quindi vengono
esclusi dalla ricerca).
 
Ad ogni modo, come gia` scritto, per prima
cosa far andare "find" senza comandi, per
vedere cosa trova.
 
bye,
 
-- 
 
piergiorgio

 vedere cosa trova.
 
Visto che, se ho capito bene, l'esigenza e` quella di cancellare tutte
le subdirectory, ed il loro contenuto,  presenti in /home/ipcam e piu`
vecchie di 7 giorni, credo che una soluzione potrebbe essere questa:
 
find /home/ipcam/* -type d -ctime +7 | xargs rm -rf
 
 

 find /home/ipcam/* -type d -ctime +7 | xargs rm -rf
 
Con "*" direi che non funziona.
Hai provato?
 
Ovviamente, si potrebbe creare un top-folder e dentro
avere i sub-folder con la data.
Dopo di che si fa puntare "find" a quel top-folder.
 
bye,
 
-- 
 
piergiorgio

 Dopo di che si fa puntare "find" a quel top-folder.
 
Allora non ho capito ... credo fosse proprio quella la situazione
dell'OP.
 
 


Da quello che ho capito io, l'OP ha:
 
/home/ipcam/2014/x.jpg
/home/ipcam/2015/x.jpg
/home/ipcam/2016/x.jpg
...
 
Si vuole cancellare *tutto* quello che e`
piu` vecchio di un certo tempo.
Incluso il folder che lo contiene.
 
Quindi:
 
find /home/ipcam/* ...
 
*forse* trova tutti i file "x.jpg", ma non i
folder che li contengono, perche` sono i punti
di partenza di "find".
Quello che ho capito io e` che l'OP vorrebbe
eliminare anche i folder.
 
Ora, io *non* ho provato, bisognerebbe fare
un test e vedere se tali top folder sono
riportati da "find" e se sono "cancellabili".
 
Puo` essere che funzioni anche con "*".
 
Nota riguardo "find" e "xargs":
Conviene sempre usare "find ... -print0 | xargs -0 ...".
La spiegazione di "-print0" e` in "man find".
 
bye,
 
-- 
 
piergiorgio

 Puo` essere che funzioni anche con "*".
 
E difatti, mi rimangio tutto, funziona
perfettamente con "*", con il comando
originale dell'OP.
 
Quindi, non saprei quale problema vi sia.
 
bye,
 
-- 
 
piergiorgio

 Salve,
 
Ciao!

Avrei quest'idea, pero' poi per metterlo in crontab dovresti pensarci
tu, che io dovrei riguardare la doc che non ricordo bene.
 
Fai il seguente script eseguibile:
------------------
#!/bin/bash
 
let TARGET="$(date +%s) - 86400*7"
CANCELLA="$(date +%Y%m%d --date="@$TARGET")"
cd /home/ipcam/
rm -fr $CANCELLA/
----------
 
Esso ogni giorno ti cancella la subdirectory di 7 giorni prima. Vale,
senza bisogno di cambiarla, per ogni anno - mese - giorno a venire.
 
-- 
bye, Yoda
 

 ----------
 
ma mettere il direttament in crontab
 
0 1 * * * /bin/rm -rvf /home/ipcam/$(date +%Y%m%d --date='1 week ago')


 0 1 * * * /bin/rm -rvf /home/ipcam/$(date +%Y%m%d --date='1 week ago')
 
Si', tra l'altro io l'opzione -f non ce la metterei, cosi' se per caso
c'e' errore lo vedo, tanto dice che vengono scritti ogni giorno.
 
Vedi pero' il cd l'ho messo per ulteriore estrema sicurezza, perche' se
per caso la variabile CANCELLA, o l'equivalente $(), e' vuota, allora il
comando rm -r mi fa fuori tutta la directory ipcam, no?
 
Ps. Ma, con l'opzione -v per rm, cron dove lo visualizza quello che fa?
 
 
-- 
bye, Yoda
 

 Quindi, non saprei quale problema vi sia.
 
root@Server01:/home/ipcam# ls
20170420  20170422  20170424  20170426  20170428
20170421  20170423  20170425  20170427
root@Server01:/home/ipcam#
 
Ed in crontab ho:
 
30 02 * * * /usr/bin/find /home/ipcam/* -mtime +7 -delete
 
Quindi il comando non ha sortito gli effetti desiderati...
 
Saluti.
GabrieleMax

> 30 02 * * * /usr/bin/find /home/ipcam/* -mtime +7 -delete
 
Ho eseguito or ora il seguente comando:
 
/usr/bin/find /home/ipcam/* -mtime +7 > lista.txt
 
Editando il file trovo il solo contenuto della directory 20170420, tanti 
file come il seguente:
 
/home/ipcam/20170420/164221m.avi
 
Essendo il crontab schedulato stanotte in teoria domani dovrei vedermi 
la roba del 20 cancellata e se non dovesse andare molto probabilmente il 
problema potrà essere riconducibile al comando -delete
 
Saluti!
GabrieleMax


Già l'ho postato ma lo ripeto.  Il comando che devi usare è:
/usr/bin/find /home/ipcam -mtime +7 -delete
Nota la mancanza di "/*" nel path di partenza di find.
 
Per come hai scritto tu il comando find ricerca esclusivamente 
all'interno delle subdirectories e non cancellerà le subdirectories stesse.


 all'interno delle subdirectories e non cancellerà le subdirectories stesse.
 
Pensavo anche io fosse cosi`, ma invece, ho provato,
trova anche l'espansione della linea di comando.
E cancella le directory stesse.
 
Cioe` find /home/ipcam/* -mtime ....
 
Trova anche i folder espansi da "*", se il test e`
positivo.
 
bye,
 
-- 
 
piergiorgio

 positivo.
 
root@Server01:/home/ipcam# ls
20170421  20170424  20170427  Nuovo Documento di testo.txt
20170422  20170425  20170428  pROVA.TXT.txt
20170423  20170426  20170429
 
Quindi stanotte ha eliminato dati e directory del 20 quindi funzione 
anche con /*
 
Saluti!
GabrieleMax