A combinação find
e ls
funciona bem para
- nomes de arquivos sem novas linhas
- quantidade não muito grande de arquivos
- nomes de arquivos não muito longos
A solução:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
Vamos dividir:
Com find
nós podemos combinar todos os arquivos interessantes como este:
find . -name "my-pattern" ...
usando -print0
, podemos passar todos os nomes de arquivos com segurança para o ls
seguinte:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
find
parâmetros e padrões de pesquisa adicionais podem ser adicionados aqui
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -t
classificará os arquivos pela hora da modificação (mais recentes primeiro) e os imprimirá um em uma linha. Você pode usar -c
para classificar por hora de criação. Nota : isso será interrompido com nomes de arquivos contendo novas linhas.
Finalmente, head -1
obtemos o primeiro arquivo na lista classificada.
Nota: xargs
use limites do sistema para o tamanho da lista de argumentos. Se esse tamanho exceder, xargs
chamará ls
várias vezes. Isso interromperá a classificação e provavelmente também a saída final. Corre
xargs --show-limits
para verificar os limites do seu sistema.
Nota 2: use find . -maxdepth 1 -name "my-pattern" -print0
se você não deseja pesquisar arquivos através de subpastas.
Nota 3: Como apontado pelo @starfry - o -r
argumento for xargs
está impedindo a chamada de ls -1 -t
, se nenhum arquivo foi correspondido pelo find
. Obrigado pela sugestão.