Abbastanza semplicemente, dato che hai taggato linux, hai il stat
comando disponibile, che estrarrà l'ora di modifica di un file, e il GNU date
comando, che estrarrà l'ora da un dato orario:
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'esecuzione di prova con il -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, in:Understanding the -exec option of `find`
Nota che non lo facciamo voglio il {} +
versione di find
qui, poiché vogliamo il -exec
risultati per file, in modo da eliminare solo i file che corrispondono all'intervallo di tempo.
Lo script shell incorporato 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
sull'$1
parametro dello script shell incorporato;$1
è stato assegnato dafind
come uno dei nomi di percorso che ha trovato. L'opzione %Y alstat
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 porzione di Ore di quel tempo; il@
la sintassi indicadate
che gli stiamo dando secondi dall'epoca come formato di input. Con il-
opzione nel formato di output della data, diciamo a GNU date di not riempi il valore con eventuali zeri iniziali. Questo previene ogni errata interpretazione ottale in seguito.
Una volta ottenuto il $h
Assegnata la variabile ora, usiamo l'operatore condizionale di bash [[
per chiedere se quel valore è maggiore o uguale a 11 e anche rigorosamente minore di 15.