Come elencare i file più vecchi di un giorno con “2015” nel nome del file?

Voglio elencare tutti i file di registro che non appartengono a oggi e solo i file che contengono 2015 nel loro nome.

Questi sono i comandi che ho provato:

 find . -name 2015 -mtime +1 -exec ls -ltrh {} \; 
 find . -name *2015* -mtime +1 -exec ls -ltrh {} \; 

L’output di entrambi non è niente, ma comunque i file ci sono. C’è qualcosa di sbagliato in questi comandi e io non ho capito cosa. Qualsiasi aiuto sarebbe apprezzato.

Il comando find . -name '*2015*' -mmin +1440 -ls find . -name '*2015*' -mmin +1440 -ls probabilmente farà ciò che vuoi. Vedi sotto per i dettagli.

Il tuo primo comando aveva -name 2015 . Non ha funzionato perché trova solo i file i cui nomi sono esattamente 2015 , senza altri caratteri.

Il tuo secondo comando, find . -name *2015* -mtime +1 -exec ls -ltrh {} \; find . -name *2015* -mtime +1 -exec ls -ltrh {} \; , potrebbe aver fallito per un paio di motivi:

1. * caratteri non quotati * vengono espansi dalla shell, quindi trasmessi per find .

Se ci sono file direttamente contenuti nella directory corrente (quella in cui hai eseguito quel comando find ... ) i cui nomi contengono 2015 (e non iniziano con a . ), La shell è stata espansa *2015* in una lista di quei nomi di file, quindi ha passato quell’elenco come argomenti da find . Questo non è quello che vuoi – invece, vuoi passare *2015* letteralmente come argomento da trovare, in modo che find , e non la shell, possa trovare i file corrispondenti.

Per risolvere questo problema, citare *2015* . Ci sono tre modi comuni per farlo:

  • '*2015*' (ad esempio, find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \; )
  • "*2015*" (ad esempio, find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \; )
  • \*2015\* (ad esempio, find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \; )

Suggerisco di scriverlo con virgolette singole come '*2015*' , perché:

  • Citando i singoli caratteri con \ può rendere difficile vedere esattamente ciò che viene passato dalla shell al comando find .
  • Citando con " volte comporta regole un po ‘complicate .

Ma in questo caso non ha molta importanza. ' e " entrambi trattano * lo stesso e l’espressione non è abbastanza complicata per \ quotare per renderlo difficile da capire.

2. -mtime +1 seleziona solo i file modificati due o più giorni fa.

Come dice l’ man find dice:

  Numeric arguments can be specified as +n for greater than n , -n for less than n , n for exactly n . 
  -mtime n File's data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times. 
  -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. 

Supponiamo che un file sia stato modificato 47 ore fa. Per capire quanti periodi di 24 ore sono, find giri giusti : è un periodo di 24 ore fa. Ma -mtime +1 corrisponde solo ai file i cui tempi di modifica sono strettamente più di un periodo di 24 ore fa. Quindi i file di ieri non sono abbinati.

Vedi Perché find -mtime +1 restituisce solo i file più vecchi di 2 giorni? per ulteriori informazioni, come suggerito da Steeldriver .

Per trovare i file modificati l’ultima volta in qualsiasi momento più di 24 ore fa , suggerisco invece di stipularlo come 1440 minuti fa con -mmin +1440 :

 find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \; 

Alcuni lettori potrebbero chiedersi perché non ho citato {} . Alcune persone citano {} per ricordare agli umani che non è un’espressione per l’ espansione delle coppie . Le shell di tipo Bourne (come bash ) non richiedono {} con niente dentro per essere quotato. Forse alcune shell non-Bourne lo trattano in modo speciale; questo potrebbe essere il motivo per cui alcuni utenti lo citano. Ma c’è anche un equivoco che a volte si deve citare {} così -exec gestisce correttamente i nomi dei file con spazi. Questo è falso: con {} o '{}' , find ottiene gli stessi argomenti, poiché la shell rimuove le virgolette prima di passare '{}' per find . Per contrastare questo equivoco, non cito {} , ma è una questione di stile – se preferisci {} per documentare come la shell non tratti specificamente { e } , va bene.

Vi consiglio anche di cambiare il comando ls , o (come suggerito da muru ) sostituirlo con l’azione find -s -ls . ls -ltrh probabilmente non sta facendo ciò che si intende perché viene eseguito separatamente per ogni file trovato e quindi i flag -t e -r , che specificano l’ordinamento, sono irrilevanti.

Anche se l’output verrà formattato in modo leggermente diverso rispetto a ls -l , usare -ls è più semplice e più semplice.

 find . -name '*2015*' -mmin +1440 -ls 

Oppure, se decidi che devi solo elencare i nomi dei file (compresi i loro percorsi, relativi a . ), Non puoi semplicemente specificare alcuna azione, facendo in modo che venga utilizzata l’azione predefinita di -print :

 find . -name '*2015*' -mmin +1440 

Cita l’espressione e ti suggerisco di citare le parentesi pure

 find . -name "2015" -mtime +1 -exec ls -ltrh '{}' \; 

o

 find . -name "*2015*" -mtime +1 -exec ls -ltrh '{}' \; 

non è necessario passare i file che trovi a ls

 find . -name "*2015*" -mtime +1 

In zsh , puoi usare qualificatori globali (questa è una caratteristica zsh unica, non disponibile in altre shell come bash).

 ls -ltr *2015*(m+1) 

Questo elenca solo i file nella directory corrente; attraversare le directory in modo ricorsivo , utilizzare

 ls -ltr **/*2015*(m+1) 

Con find , -name 2015 trova solo i file il cui nome è esattamente 2015 . -name *2015* funziona solo se non ci sono file il cui nome contiene 2015 nella directory corrente, perché la shell espande il pattern *2015* prima che venga richiamato find . Devi citare il modello:

 find -name '*2015*' -mtime +1 … 

Nota che find -mtime +1 e zsh’s *(m+1) trovano i file che hanno almeno 48 ore di vita , non i file più vecchi di oggi. Il segno più significa “rigorosamente più di” e il numero di giorni viene arrotondato per difetto. Per trovare file di almeno 24 ore, utilizzare -mtime +0 o (m+0) .

Se vuoi trovare i file che sono stati modificati l’ultima volta ieri o prima , puoi usare find con il predicato -newermt :

 find -name '*2015*' ! -newermt 'today 0:00' … 

Non c’è un modo veramente comodo per fare questo test in zsh.