Linux: usando find per individuare i file più vecchi di <data>


31

findha un buon supporto per trovare i file più modificati meno di X giorni fa, ma come posso usare findper localizzare tutti i file modificati dopo una certa data?

Non riesco a trovare nulla nella findpagina man per fare questo, solo per confrontare i tempi di un altro file o per verificare le differenze tra il tempo creato e ora. Fare un file con il tempo desiderato e confrontarlo con quello è l'unico modo per farlo?


1
Questo sarebbe meglio chiedere a SuperUser.com
Josh Brower,

6
Non ho intenzione di chiudere questo: potrebbe essere interessante anche per gli amministratori di sistema.
splattne

Il comando fa parte di uno script di backup, che prende tutto da / etc che è stato modificato dopo l'installazione nei nostri backup notturni.
DrStalker,

Nove anni e ho appena notato la moderazione di una nuova risposta: il titolo e il corpo di questa domanda non affermano lo stesso. Il titolo richiede "file più vecchi di <data>" ma il corpo afferma "modificato dopo una certa data". Interpreto "dopo" come più recente di una data specifica, non più vecchia.
Joffrey,

Risposte:


19

Se hai solo '-newer file', puoi prendere questa soluzione alternativa:

touch -t 201003160120 some_file
find . -newer some_file

tocco di uomo:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Supponendo che il tuo tocco abbia questa opzione (il mio è il tocco 5.97).


48

No, puoi utilizzare una stringa data / ora.

Da man find:

-newerXY reference
Confronta il timestamp del file corrente con riferimento. L'argomento di riferimento è normalmente il nome di un file (e uno dei suoi timestamp è usato per il confronto) ma può anche essere una stringa che descrive un tempo assoluto. X e Y sono segnaposto per altre lettere e queste lettere selezionano l'ora che appartiene al modo in cui viene utilizzato il riferimento per il confronto.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

Esempio:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls

5
Sto usando Centos 5.2, che utilizza GNU find versione 4.2.27, e non supporta -newermt o alcun parametro -newer diverso da "-newer file"
DrStalker

1
GNU findutils 4.3.3 e supporti più recenti -newerXY secondo savannah.gnu.org/bugs/?11668
Philip Durbin,

25

Non direttamente correlato alla domanda, ma potrebbe essere interessante per alcuni che inciampano qui.

Il comando find non supporta direttamente il parametro -older per trovare file più vecchi di una data richiesta, ma è possibile utilizzare l'istruzione negate (usando l'esempio di risposta accettata):

touch -t 201003160120 some_file
find . ! -newer some_file

restituirà i file più vecchi della data fornita.


3
redattori - forse dovrebbe essere unito in una risposta accettata?
nEJC

questa soluzione è il modo più elegante per risolvere questo tipo di problema :)
Labynocle,

9
find <dir> -mtime -20

questo comando find troverà i file modificati negli ultimi 20 giorni.

  • mtime -> modificato (atime = accesso, ctime = creato)
  • -20 -> meno di 20 giorni (20 esattamente 20 giorni, +20 più di 20 giorni)

Puoi aggiungere ulteriori limitazioni come:

find <dir> -mtime -20 -name "*.txt"

lo stesso di prima, ma trova solo i file che terminano con '.txt'.


5

Solo per aggiungere - puoi anche usare due nuovi argomenti per cercare in un intervallo di tempo:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

per trovare tutti i file da marzo 2007.


1

Potresti usare uno script come questo

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

Salvalo nel tuo $ PATH come "newerthan" e rendilo eseguibile.

Quindi puoi trovare il file modificato dopo una certa data come questa:

newerthan "2010-03-10"

o

newerthan "last year"

o

newerthan "yesterday"

Questo dovrebbe fare quello che vuoi. Non penso che ci sia un modo integrato per raggiungere questo obiettivo altrimenti.


Non è necessario utilizzare bcper la matematica dei numeri interi, Bash può farlo: ((seconds = when - now))l'argomento formato per datedovrebbe avere un valore positivo date +%se alcuni sistemi potrebbero non date -d
esserlo

Questo è per Centos 5.2. Che ha -d. Utile da sapere sulla matematica dei numeri interi però.
Richard Holloway,

1
find ! -newermt “<DATE>”

come questo:

find ! -newermt “jan 01 2015” 

Questo ti darà file più vecchi di 01-01-2015 nella tua directory corrente.

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/


Stavo per scrivere un commento dandoti il ​​benvenuto su ServerFault e chiedendoti di riconsiderare la posa di una risposta duplicata fino a quando ho capito che il titolo della domanda e il corpo dicono cose diverse: il titolo chiede "file più vecchi di <data>" e gli stati della domanda "modificati dopo una certa data ', che secondo me sono due cose diverse. Forse nel tuo post potresti chiarire la differenza e spiegare l'uso del negato. Grazie per il tuo contributo e posterò un commento sulla domanda per chiarimenti. Grazie per aver contribuito!
Joffrey,

0

se la tua data è formattata in modo tale che sia ok per il confronto,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.