A combinação finde lsfunciona 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 findnó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 lsseguinte:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
findparâmetros e padrões de pesquisa adicionais podem ser adicionados aqui
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -tclassificará os arquivos pela hora da modificação (mais recentes primeiro) e os imprimirá um em uma linha. Você pode usar -cpara classificar por hora de criação. Nota : isso será interrompido com nomes de arquivos contendo novas linhas.
Finalmente, head -1obtemos o primeiro arquivo na lista classificada.
Nota: xargs use limites do sistema para o tamanho da lista de argumentos. Se esse tamanho exceder, xargschamará lsvá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" -print0se você não deseja pesquisar arquivos através de subpastas.
Nota 3: Como apontado pelo @starfry - o -rargumento for xargsestá impedindo a chamada de ls -1 -t, se nenhum arquivo foi correspondido pelo find. Obrigado pela sugestão.