GNU/Linux >> Linux Esercitazione >  >> Linux

Come eliminare i file creati tra due volte?

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:

  1. $(stat -c %Y "$1") -- questa (seconda) sostituzione di comando chiama stat sull'$1 parametro dello script shell incorporato; $1 è stato assegnato da find come uno dei nomi di percorso che ha trovato. L'opzione %Y al stat Il comando restituisce il tempo di modifica in secondi dall'epoca.
  2. date -d @ ... +%-H -- questo prende i secondi dall'epoca dalla sostituzione del comando precedente e chiede date per darci la porzione di Ore di quel tempo; il @ la sintassi indica date 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.


Linux
  1. Come estrarre i registri tra due timestamp?

  2. Come sincronizzare i file tra due telecomandi?

  3. Come ottenere solo i file creati dopo un appuntamento con Ls?

  4. Linee comuni tra due file?

  5. Come ottengo la differenza tra due date sotto bash

Come visualizzare due file affiancati in Linux

Come unire due file di testo in Linux

Come confrontare due file nel terminale Linux

Come sincronizzare automaticamente i file tra due server Linux

Come eliminare i file elencati in un altro file in Linux

Come rimuovere/eliminare file in Linux usando il comando rm