Parece que ls
não classifica os arquivos corretamente ao fazer uma chamada recursiva:
ls -altR . | head -n 3
Como posso encontrar o arquivo modificado mais recentemente em um diretório (incluindo subdiretórios)?
bash
filesystems
find
JMW
fonte
fonte
Respostas:
Para uma árvore enorme, pode ser difícil
sort
manter tudo na memória.%T@
fornece o tempo de modificação, como um carimbo de data / hora unix,sort -n
classifica numericamente,tail -1
pega a última linha (carimbo de data / hora mais alta),cut -f2 -d" "
corta o primeiro campo (o carimbo de data / hora) da saída.Edit: Assim como
-printf
provavelmente é apenas o GNU,stat -c
também é possível o uso de um novo. Embora seja possível fazer o mesmo no BSD, as opções de formatação são diferentes (-f "%m %N"
ao que parece)E eu perdi a parte do plural; se você quiser mais do que o arquivo mais recente, basta aumentar o argumento da cauda.
fonte
sort -rn | head -3
em vez desort -n | tail -3
. Uma versão fornece os arquivos do mais antigo para o mais novo, enquanto a outra passa do mais recente para o mais antigo.sort
criará arquivos temporários (in/tmp
) conforme necessário, então não acho que seja uma preocupação.-printf '%T@ %Tb %Td %TY %p\n'
vai dar-lhe um carimbo de data (se necessário) (semelhante als
)find . -type f -printf '%TF %TT %p\n' | sort | tail -1
Seguindo a resposta da @ plundra , aqui está a versão BSD e OS X:
fonte
find
suporta, em+
vez de\;
? Porque isso faz a mesma coisa (passando vários arquivos como parâmetros), sem o-print0 | xargs -0
pipe.head -1
parahead -5
Em vez de classificar os resultados e manter apenas os últimos modificados, você pode usar o awk para imprimir apenas aquele com maior tempo de modificação (em tempo unix):
Essa deve ser uma maneira mais rápida de resolver seu problema se o número de arquivos for grande o suficiente.
Eu usei o caractere NUL (ou seja, \ 0 ') porque, teoricamente, um nome de arquivo pode conter qualquer caractere (incluindo espaço e nova linha), exceto isso.
Se você não possui esses nomes de arquivos patológicos em seu sistema, também pode usar o caractere de nova linha:
Além disso, isso também funciona em mawk.
fonte
mawk
a alternativa padrão do Debian.Ocorreu um problema ao encontrar o último arquivo modificado no Solaris 10. Não
find
existe aprintf
opção estat
não está disponível. Eu descobri a seguinte solução que funciona bem para mim:Para mostrar o nome do arquivo, use
Explicação
find . -type f
localiza e lista todos os arquivossed 's/.*/"&"/'
agrupa o nome do caminho entre aspas para lidar com espaços em brancoxargs ls -E
envia o caminho entre aspas parals
, a-E
opção garante que um registro de data e hora completo (formato ano-mês-dia hora-minuto-segundos-nanossegundos ) seja retornadoawk '{ print $6," ",$7 }'
extrai apenas data e horaawk '{ print $6," ",$7," ",$9 }'
extrai data, hora e nome do arquivosort
retorna os arquivos classificados por datatail -1
retorna apenas o último arquivo modificadofonte
Isso parece funcionar bem, mesmo com subdiretórios:
No caso de muitos arquivos, refine a localização.
fonte
-l
opção dels
parece desnecessária. Apenas-tr
parece suficiente.find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
Mostra o arquivo mais recente com carimbo de data / hora legível por humanos:
O resultado fica assim:
Para mostrar mais arquivos, substitua
-n1
por um número maiorfonte
Eu uso algo semelhante o tempo todo, bem como a lista top-k dos arquivos modificados mais recentemente. Para árvores de diretório grandes, pode ser muito mais rápido evitar a classificação . No caso dos top-1 arquivo modificado mais recentemente:
Em um diretório que contém 1,7 milhão de arquivos, recebo o mais recente do 3.4s, uma aceleração de 7.5x em relação à solução 25.5s usando sort.
fonte
lastfile
) e, em seguida, você pode fazer o que quiser com o resultado, tais comols -l $(lastfile .)
, ouopen $(lastfile .)
(em um Mac), etc.Isso fornece uma lista classificada:
Inverta a ordem colocando um '-r' no comando de classificação. Se você quiser apenas nomes de arquivos, insira "awk '{print $ 11}' |" antes de '| cabeça'
fonte
No Ubuntu 13, o seguinte é feito, talvez um pouco mais rápido, pois inverte o tipo e usa 'head' em vez de 'tail', reduzindo o trabalho. Para mostrar os 11 arquivos mais recentes em uma árvore:
encontrar . -tipo f -printf '% T @% p \ n' | ordenar -n -r | cabeça -11 | corte -f2- -d "" | sed -e 's, ^. / ,,' | xargs ls -U -l
Isso fornece uma lista completa de ls sem reclassificar e omite o irritante './' que 'find' coloca em cada nome de arquivo.
Ou, como uma função bash:
Ainda assim, a maior parte do trabalho foi realizada pela solução original da plundra. Graças plundra.
fonte
Eu enfrentei o mesmo problema. Preciso encontrar o arquivo mais recente recursivamente. find levou cerca de 50 minutos para encontrar.
Aqui está um pequeno script para fazê-lo mais rápido:
É uma função recursiva que obtém o item modificado mais recente de um diretório. Se este item for um diretório, a função é chamada recursivamente e pesquisa nesse diretório, etc.
fonte
Acho o seguinte mais curto e com saída mais interpretável:
Dado o comprimento fixo das datas padronizadas no formato ISO, a classificação lexicográfica é boa e não precisamos da
-n
opção na classificação.Se você deseja remover os carimbos de data e hora novamente, pode usar:
fonte
Se a execução
stat
de cada arquivo individualmente for lenta, use-axargs
para acelerar um pouco as coisas:fonte
Isso altera recursivamente o tempo de modificação de todos os diretórios no diretório atual para o arquivo mais recente em cada diretório:
fonte
Este CLI simples também funcionará:
Você pode alterar o -1 para o número de arquivos que deseja listar
fonte
Achei o comando acima útil, mas, para o meu caso, eu precisava ver a data e a hora do arquivo e também tive um problema com vários arquivos com espaços nos nomes. Aqui está a minha solução de trabalho.
fonte
O seguinte comando funcionou no Solaris:
fonte
Ignorando arquivos ocultos - com carimbo de tempo agradável e rápido
Resultado
Manipula bem os espaços nos nomes de arquivos - não que eles devam ser usados!
Mais
Mais
find
abundância seguindo o link.fonte
Para procurar arquivos no diretório / target_directory e todos os seus subdiretórios, que foram modificados nos últimos 60 minutos:
Para encontrar os arquivos modificados mais recentemente, classificados na ordem inversa do tempo de atualização (ou seja, os arquivos atualizados mais recentemente):
fonte
Eu prefiro este, é mais curto:
fonte
Eu escrevi um pacote pypi / github para esta pergunta porque também precisava de uma solução.
https://github.com/bucknerns/logtail
Instalar:
Uso: caudas arquivos alterados
Uso2: Abre o último arquivo alterado no editor
fonte