Il comando find . -name '*2015*' -mmin +1440 -ls
probabilmente farà quello che vuoi. Vedi sotto per i dettagli.
Il tuo primo comando ha avuto -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 {} \;
potrebbe non essere riuscito per un paio di motivi:
1. I*
caratteri non quotati vengono espansi dalla shell, quindi passati a find
.
Se ci sono file direttamente contenuti nella directory corrente (quella in cui ti sei imbattuto quando hai eseguito quel find ...
comando) i cui nomi contengono 2015
(e non iniziano con a .
), la shell si è espansa *2015*
in un elenco di quei nomi di file, quindi è passata tale elenco come argomenti a 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 quali file corrispondono.
Per risolvere il problema, citare *2015*
. Esistono tre modi comuni per farlo:
'*2015*'
(cioè, find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)
"*2015*"
(cioè, find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)
\*2015\*
(cioè, find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Io suggerisco di scriverlo con virgolette singole come '*2015*'
, perché:
Ma in questo caso non importa. '
ed "
entrambi trattano *
lo stesso e l'espressione non è abbastanza complicata da essere \
citata per renderla difficile da capire.
2. -mtime +1
seleziona solo i file modificati due o più giorni fa.
Come 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
arrotondati per eccesso : è un periodo di 24 ore fa. Ma -mtime +1
corrisponde solo ai file i cui tempi di modifica sono strettamente superiori a un periodo di 24 ore fa. Pertanto, i file di ieri non corrispondono.
Vedi Perché find -mtime +1 restituisce solo 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 del tutore . Le conchiglie in stile Bourne (come bash ) non richiedono {}
che all'interno non vi sia nulla da quotare. Forse una shell non in stile Bourne la tratta in modo speciale; questo potrebbe essere il motivo per cui alcuni utenti lo citano. Ma c'è anche un'idea sbagliata che a volte si debba citare, {}
quindi -exec
gestisce correttamente i nomi dei file con spazi. Quello; s false: con {}
o '{}'
, find
ottiene gli stessi argomenti, poiché la shell rimuove le virgolette prima di passare '{}'
afind
. Per contrastare questo malinteso, non cito {}
, ma è una questione di stile - se preferisci {}
documentare come la shell non sta trattando {
e }
specialmente, va bene.
Ti consiglio anche di cambiare il tuo ls
comando o (come ha suggerito muru ) di sostituirlo con find
l' -ls
azione. ls -ltrh
probabilmente non sta facendo ciò che intendi perché viene eseguito separatamente per ogni file trovato e quindi i flag -t
e -r
, che specificano l'ordinamento, sono irrilevanti.
Sebbene l'output verrà formattato in modo leggermente diverso rispetto a ls -l
, l'utilizzo -ls
è più semplice e facile.
find . -name '*2015*' -mmin +1440 -ls
Oppure, se decidi che devi davvero elencare solo i nomi dei file (compresi i loro percorsi, relativamente a .
), puoi semplicemente specificare nessuna azione, facendo -print
in modo che venga usata l'azione predefinita :
find . -name '*2015*' -mmin +1440
find
parte mi sembra buona, ma ho anche avuto problemi con il-exec
parametro. Neanche io riuscivo a farlo funzionare. (Stavo cercando di spostare tutti i file jpg da una cartella alla sua directory principale attraverso di essa - e ho finito per farlo manualmente ...)