2015-10-29 22 views
17

Sto cercando di trovare i file modificati negli ultimi x minuti, ad esempio nell'ultima ora. Molti forum e tutorial in rete suggeriscono di utilizzare il comando find con l'opzione -mmin, in questo modo:Come trovare i file modificati negli ultimi minuti x (find -mmin non funziona come previsto)

find . -mmin -60 |xargs ls -l

Tuttavia, questo comando non ha funzionato per me come previsto. Come si può vedere dal seguente elenco, mostra anche i file modificati prima di 1 ora fa:

-rw------- 1 user user 9065 Oct 28 23:13 1446070435.V902I67a5567M283852.harvester 
-rw------- 1 user user 1331 Oct 29 01:10 1446077402.V902I67a5b34M538793.harvester 
-rw------- 1 user user 1615 Oct 29 01:36 1446078983.V902I67a5b35M267251.harvester 
-rw------- 1 user user 72365 Oct 29 02:27 1446082022.V902I67a5b36M873811.harvester 
-rw------- 1 user user 69102 Oct 29 02:27 1446082024.V902I67a5b37M142247.harvester 
-rw------- 1 user user 2611 Oct 29 02:34 1446082482.V902I67a5b38M258101.harvester 
-rw------- 1 user user 2612 Oct 29 02:34 1446082485.V902I67a5b39M607107.harvester 
-rw------- 1 user user 2600 Oct 29 02:34 1446082488.V902I67a5b3aM465574.harvester 
-rw------- 1 user user 10779 Oct 29 03:27 1446085622.V902I67a5b3bM110329.harvester 
-rw------- 1 user user 5836 Oct 29 03:27 1446085623.V902I67a5b3cM254104.harvester 
-rw------- 1 user user 8970 Oct 29 04:27 1446089232.V902I67a5b3dM936339.harvester 
-rw------- 1 user user 165393 Oct 29 06:10 1446095400.V902I67a5b3eM290158.harvester 
-rw------- 1 user user 105054 Oct 29 06:10 1446095430.V902I67a5b3fM265065.harvester 
-rw------- 1 user user 1615 Oct 29 06:24 1446096244.V902I67a5b40M55701.harvester 
-rw------- 1 user user 1620 Oct 29 06:24 1446096292.V902I67a5b41M337769.harvester 
-rw------- 1 user user 10436 Oct 29 06:36 1446096973.V902I67a5b42M707215.harvester 
-rw------- 1 user user 7150 Oct 29 06:36 1446097019.V902I67a5b43M415731.harvester 
-rw------- 1 user user 4357 Oct 29 06:39 1446097194.V902I67a5b56M446687.harvester 
-rw------- 1 user user 4283 Oct 29 06:39 1446097195.V902I67a5b57M957052.harvester 
-rw------- 1 user user 4393 Oct 29 06:39 1446097197.V902I67a5b58M774506.harvester 
-rw------- 1 user user 4264 Oct 29 06:39 1446097198.V902I67a5b59M532213.harvester 
-rw------- 1 user user 4272 Oct 29 06:40 1446097201.V902I67a5b5aM534679.harvester 
-rw------- 1 user user 4274 Oct 29 06:40 1446097228.V902I67a5b5dM363553.harvester 
-rw------- 1 user user 20905 Oct 29 06:44 1446097455.V902I67a5b5eM918314.harvester 

In realtà, è appena elencati tutti i file nella directory corrente. Siamo in grado di prendere uno di questi file come esempio e verificare se la sua data di modifica è davvero come visualizzato dal comando ls:

stat 1446070435.V902I67a5567M283852.harvester 

    File: ‘1446070435.V902I67a5567M283852.harvester’ 
    Size: 9065  Blocks: 24   IO Block: 4096 regular file 
Device: 902h/2306d Inode: 108680551 Links: 1 
Access: (0600/-rw-------) Uid: (1001/ user) Gid: (1027/ user) 
Access: 2015-10-28 23:13:55.281515368 +0100 
Modify: 2015-10-28 23:13:55.281515368 +0100 
Change: 2015-10-28 23:13:55.313515539 +0100 

Come si può vedere, questo file è stato definitivamente modificato l'ultima volta precedente di 1 ora fa ! Ho anche provato find -mmin 60 o find -mmin +60, ma non ha funzionato neanche.

Perché sta succedendo e come utilizzare correttamente il comando di ricerca?

risposta

30

Posso riprodurre il problema se ci sono nessun file nella directory che sono stati modificati nell'ultima ora. In tal caso, find . -mmin -60 non restituisce nulla. Il comando find . -mmin -60 |xargs ls -l, tuttavia, restituisce ogni file nella directory che è coerente con ciò che accade quando ls -l viene eseguito senza un argomento.

Per assicurarsi che ls -l viene eseguito solo quando viene trovato un file, provare:

find . -mmin -60 -type f -exec ls -l {} + 
+1

Ummm..clever .. + 1 – heemayl

+0

è inoltre possibile utilizzare il flag -r per xargs per evitare che l'esecuzione se non v'è alcun input. Ovviamente, suggerisco caldamente di evitare che gli spazi nel nome del file causino problemi durante l'uso di xargs. Esempio: 'find. -mmin 60 -print0 | xargs -0r ls -l'. Newline di solito è abbastanza sicuro, tranne contro la ricerca degli attaccanti attivi. -mmin 60 | xargs '-rd \ n' ls -l' L'alternativa -exec nella risposta sopra ovviamente risolve entrambi i problemi. –

-1

Questo comando può essere aiutare a signore

find -type f -mtime -60 
+0

find -type f -mtime -90 –

+0

trova file più vecchi di 60 ** giorni **, non minuti. – MSalters

2

manuale di find:

Numeric arguments can be specified as 

    +n  for greater than n, 

    -n  for less than n, 

    n  for exactly n. 

    -amin n 
      File was last accessed n minutes ago. 

    -anewer file 
      File was last accessed more recently than file was modified. If file is a symbolic link and the -H option or the -L option is in effect, the access time of the file it points to is always 
      used. 

    -atime n 
      File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to 
      have been accessed at least two days ago. 

    -cmin n 
      File's status was last changed n minutes ago. 

    -cnewer file 
      File's status was last changed more recently than file was modified. If file is a symbolic link and the -H option or the -L option is in effect, the status-change time of the file it points 
      to is always used. 

    -ctime n 
      File's status was last changed n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file status change times. 

Esempio:

find /dir -cmin -60 # creation time 
find /dir -mmin -60 # modification time 
find /dir -amin -60 # access time 
0

Questo potrebbe funzionare per voi. L'ho usato per la pulizia delle cartelle durante le distribuzioni per l'eliminazione dei vecchi file di distribuzione.

clean_anyfolder() { 
    local temp2="$1/**"; //PATH 
    temp3=($(ls -d $temp2 -t | grep "`date | awk '{print $2" "$3}'`")) 
    j=0; 
    while [ $j -lt ${#temp3[@]} ] 
    do 
      echo "to be removed ${temp3[$j]}" 
      delete_file_or_folder ${temp3[$j]} 0 //DELETE HERE 
     fi 
     j=`expr $j + 1` 
    done 
} 
8

Il problema è che

find . -mmin -60 

uscite:

. 
./file1 
./file2 

Nota la linea con un punto?
Questo rende ls elencare l'intera directory esattamente come quando viene eseguito ls -l ..

Una soluzione è quella di elencare solo i file (non directory):

find . -mmin -60 -type f | xargs ls -l 

ma è meglio usare direttamente l'opzione exec di find:

find . -mmin -60 -type f -exec ls -l {} \; 

O semplicemente:

find . -mmin -60 -type f -ls 

Che, a proposito, è sicuro anche con le directory:

find . -mmin -60 -ls 
+0

Grazie! Questo punto era esattamente la radice del problema! – hashbang

+0

@hashbang Il solito modo di ringraziare è di alzare il voto di una risposta. Fai clic sulla freccia su sopra il numero di voti a sinistra della risposta, se lo desideri. –

0

In realtà, c'è più di un problema qui. Il principale è che xargs esegue di default il comando specificato, anche se non è stato passato alcun argomento. Per cambiare la situazione si potrebbe utilizzare un'estensione GNU al xargs:

run-se-vuoto --no-
-r
Se lo standard input non contiene Nonblanks, non eseguire il comando. Normalmente, il comando viene eseguito una volta anche se non vi è alcun input. Questa opzione è un'estensione GNU.

semplice esempio:

find . -mmin -60 | xargs -r ls -l 

Ma questo potrebbe corrispondere a tutte le sottodirectory, tra cui . (la directory corrente), e ls elencherà ciascuno di essi singolarmente. Quindi l'output sarà un casino. Soluzione: passare -d-ls, che vieta elenca il contenuto della directory:

find . -mmin -60 | xargs -r ls -ld 

Ora non ti piace . (la directory corrente) nella vostra lista? Soluzione: escludere il primo livello di directory (0) dall'uscita find:

find . -mindepth 1 -mmin -60 | xargs -r ls -ld 

Ora che avresti bisogno solo i file nella vostra lista? Soluzione: escludere le directory:

find . -type f -mmin -60 | xargs -r ls -l 

Ora si dispone di alcuni file con nomi che contengono spazio bianco, virgolette o backslash? Uscita uso terminazione null (trovare) e ingresso (xargs) (questi sono anche estensioni GNU, per quanto ne so):: Soluzione

find . -type f -mmin -60 -print0 | xargs -r0 ls -l 
2

Sto lavorando con lo stesso bisogno e credo che il vostro periodo di tempo non è corretta.

provare questi: il cambiamento

  • 15min: trovare. -mtime -.01
  • cambio 1 ora: trovare. -mtime -.04
  • Modifica 12 ore: trovare. -mtime -.5

Dovresti utilizzare 24 ore come base. Il numero dopo -mtime dovrebbe essere relativo a 24 ore. Quindi-5 è l'equivalente di 12 ore, perché 12 ore sono la metà di 24 ore.

0

Per cercare i file in/directory_destinazione e tutti i suoi sub-directory, che sono stati modificati negli ultimi 60 minuti:

$ find /target_directory -type f -mmin -60 

per trovare i file modificati più di recente, ordinate in ordine inverso di aggiornamento tempo (cioè, i file più aggiornati di recente prima):

$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r 
Problemi correlati