2012-06-05 8 views

risposta

24

Questo è un po 'diverso dalla soluzione di Banthar, ma funzionerà con le versioni di find che non supportano -newermt e mostra come utilizzare il comando xargs, che è uno strumento molto utile.

È possibile utilizzare il comando find per individuare i file "di una certa età". Questo troverà tutti i file modificati tra i 5 ei 10 giorni fa:

find /directory -type f -mtime -10 -mtime +5 

Per poi cercare i file per una stringa:

find /directory -type f -mtime -10 -mtime +5 -print0 | 
    xargs -0 grep -l expression 

È anche possibile utilizzare l'interruttore -exec, ma trovo più leggibile xargs (e spesso funzionerà anche meglio, ma probabilmente non in questo caso).

(Si noti che la bandiera -0 è lì per lasciare questo comando operare su file con spazi incorporati, come ad esempio this is my filename.)

Aggiornamento per la domanda nei commenti

Quando si fornisce molteplici espressioni di find , sono ANDed insieme. Per esempio, se chiedete:

find . -name foo -size +10k 

... find restituirà solo i file che sono sia (a) di nome fooe (b) più grande di 10 kbyte. Allo stesso modo, se si specifica:

find . -mtime -10 -mtime +5 

... find restituirà solo i file che sono (a) più recente di 10 giorni fa e (b) di età superiore a 5 giorni fa.

Per esempio, sul mio sistema è attualmente:

$ date 
Fri Aug 19 12:55:21 EDT 2016 

Ho i seguenti file:

$ ls -l 
total 0 
-rw-rw-r--. 1 lars lars 0 Aug 15 00:00 file1 
-rw-rw-r--. 1 lars lars 0 Aug 10 00:00 file2 
-rw-rw-r--. 1 lars lars 0 Aug 5 00:00 file3 

Se chiedo per "i file modificati più di 5 giorni fa (-mtime +5) I get:

$ find . -mtime +5 
./file3 
./file2 

Ma se chiedo "file modificati più di 5 giorni fa ma meno di 10 giorni O"(-mtime +5 -mtime -10), ottengo:

$ find . -mtime +5 -mtime -10 
./file2 
+0

Qualcuno può spiegare come specificare -mtime viene utilizzato due volte per specificare un intervallo? Nello specifico, perché un numero negativo per la prima occorrenza e un numero positivo per la seconda? O non lo capisco, o non funziona su Ubuntu 14.04.3 LTS. Non è discusso nella pagina man che sto vedendo. – battey

+0

@battey, ho aggiornato la mia risposta con una risposta alla tua domanda. – larsks

14

Unire grep con find:

find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \; 
+1

Questa opzione '-newermt' sembra non documentata - non appare nel collegamento né nelle pagine man. Tuttavia, è meraviglioso! Come l'hai scoperto? – brandizzi

+2

@brandizzi È in '-newerXY'. –

-1

find non sembra avere opzioni in cui è possibile specificare date specifiche per il confronto timestamp (almeno la versione sul mio portatile non - ci possono essere altre versioni e/o altri strumenti che funzionano allo stesso modo), quindi dovrai usare il numero di giorni. Così, a partire dal 2012/06/05, si desidera trovare i file più recenti di 9 giorni, ma più vecchio di 6 giorni:

find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ