Ho una cartella in cui eseguo il backup dei miei database e voglio eliminare tutti i backup creati tra le 11:00 e le 15:00 e non importa che giorno sia:questo è il trucco!
Ho trovato questo comando molto utile, ma non nel mio caso d'uso:
find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
Ma qui mi costringe a un intervallo tra due date! Voglio eliminare solo i backup creati tra due orari specifici.
Risposta accettata:
Abbastanza semplicemente, dato che hai taggato linux, hai il stat
comando disponibile, che estrarrà l'ora di modifica di un file e la date
GNU comando, che estrarrà l'ora da una determinata ora:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -ls
Se i risultati sembrano corretti, allora:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -delete
Ecco un test eseguito con -ls
versione:
$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} ; -ls
1705096 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./11am
1705097 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./12pm
Ringraziamo Kusalananda per aver scritto l'eccellente risposta che ho seguito, a:Capire l'opzione -exec di `trova`
Tieni presente che non vuoi il {} +
versione di find
qui, come vogliamo il -exec
risultati per file, in modo da eliminare solo i file che corrispondono all'intervallo di tempo.
Lo script della shell incorporata ha due parti principali:determinare il timestamp "ora" del file e quindi restituire l'esito positivo o negativo in base all'intervallo. La prima parte è essa stessa realizzata in due pezzi. Alla variabile viene assegnato il risultato della sostituzione del comando; il comando dovrebbe essere letto al rovescio:
$(stat -c %Y "$1")
— questa (seconda) sostituzione di comando chiamastat
sul$1
parametro dello script di shell incorporato;$1
è stato assegnato dafind
come uno dei percorsi trovati. L'opzione %Y perstat
il comando restituisce il tempo di modifica in secondi dall'epoca.date -d @ ... +%-H
— questo prende i secondi dall'epoca dalla sostituzione del comando precedente e chiededate
per darci la parte Ore di quel tempo; il@
la sintassi dicedate
che lo stiamo dando secondi dall'epoca come formato di input. Con il-
opzione nel formato di output della data, diciamo alla data GNU di non riempire il valore con eventuali zeri iniziali. Ciò impedisce in seguito qualsiasi interpretazione errata dell'ottale.
Una volta ottenuto il $h
Assegnata la variabile dell'ora, utilizziamo l'operatore condizionale di bash [[
per chiedere se quel valore è maggiore o uguale a 11 e anche rigorosamente inferiore a 15.