La combinazione di finde lsfunziona bene per
- nomi di file senza newline
- quantità non molto grande di file
- nomi di file non molto lunghi
La soluzione:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
Analizziamolo:
Con findpossiamo abbinare tutti i file interessanti come questo:
find . -name "my-pattern" ...
quindi utilizzando -print0possiamo passare tutti i nomi di file in modo sicuro a lsquesto:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
findqui è possibile aggiungere ulteriori parametri e modelli di ricerca
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -tordina i file in base al tempo di modifica (prima il più recente) e li stampa uno alla volta. È possibile utilizzare -cper ordinare in base al momento della creazione. Nota : questo si interromperà con i nomi di file contenenti newline.
Finalmente head -1ci ottiene il primo file nell'elenco ordinato.
Nota: xargs utilizzare i limiti di sistema per la dimensione dell'elenco degli argomenti. Se questa dimensione supera, xargschiamerà lspiù volte. Ciò interromperà l'ordinamento e probabilmente anche l'output finale. Correre
xargs --show-limits
per controllare i limiti del tuo sistema.
Nota 2: utilizzare find . -maxdepth 1 -name "my-pattern" -print0se non si desidera cercare file nelle sottocartelle.
Nota 3: Come sottolineato da @starfry - l' -rargomento per xargssta impedendo la chiamata di ls -1 -t, se nessun file è stato trovato da find. Grazie per il suggerimento.