Como listar arquivos recursivamente e classificá-los por tempo de modificação?

13

Como listar todos os arquivos em um diretório recursivamente e classificar a saída por tempo de modificação?

Eu normalmente uso, ls -lhtcmas ele não encontra todos os arquivos recursivamente. Estou usando Linux e Mac.

ls -l no Mac OS X pode dar

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

onde a parte da data não é consistente ou alinhada, uma solução deve levar isso em consideração.

Solução parcial

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

funciona, mas não recursivamente.

qazwsx
fonte
Eu vou assumir que você está no Linux, mas você deve especificar seu sistema operacional explicitamente na pergunta ou, de preferência, como uma tag.
precisa

Respostas:

2

Aqui está um método usando statcomo @ johnshen64 sugerido

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Computist
fonte
find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-imprimiria apenas os caminhos absolutos dos arquivos no Mac OS X.
Lri
qual versão statvocê está usando? seu formato acima não funcionou para mim. Eu tive que usar o seguinte: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Isso é comstat (GNU coreutils) 8.23
user84207 4/17/17
12

Use find's -printfe classificar em um formato de data razoável:

find -type f -printf '%T+\t%p\n' | sort -n

Isso deve minimizar os garfos do processo e, portanto, ser o mais rápido.

Exemplos se você não gostar da segunda parte fracionária (que geralmente não é implementada no sistema de arquivos):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: O padrão findno Mac não possui -printf. Mas não é difícil instalar o GNU find no Mac (veja também o link para mais advertências sobre compatibilidade com Mac / Linux e xargs).

Daniel Andersson
fonte
0

find .deve conseguir obter todos os arquivos. Algo assim:

find . -exec ls -dl '{}' \; | sort -k 6,7

Você precisa ajustá-lo para as suas necessidades.

johnshen64
fonte
Eu também assumo que é linux, como EBGreen disse, ls é um apelido no Windows PS, então você precisa usar o objeto de classificação e obter itens filhos recursivamente, se for esse o caso, mas a idéia é a mesma.
precisa saber é o seguinte
Realmente funciona corretamente quando as datas às vezes perdem a parte do ano, no Mac?
Qazwsx
você está certo, a exibição da data para arquivos recentes estragará tudo. você precisa usar stat para obter a data exatamente formatada nesse caso. meus arquivos são todos muito antiga para que o comando funcionou bem, é por isso que eu adicionei a cláusula sintonia :-)
johnshen64
@ johnshen64: lsno Linux tem uma --time-formatopção que você pode usar para garantir que as datas dos arquivos recentes e mais antigas sejam mostradas no mesmo formato.
RedGrittyBrick
ah obrigado, você está certo, só não usei isso. isso é muito mais simples do que usar stat. é chamado - time-style, eu acho.
johnshen64
0

Esta resposta a uma pergunta semelhante no site do Unix Stack Exchange me ajudou porque eu estava usando o zsh:

Como listar os arquivos classificados por data de modificação recursivamente (nenhum comando stat disponível!)

Brad Parks
fonte
Este é realmente um comentário e não uma resposta à pergunta original. Você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post . Leia Por que preciso de 50 reputação para comentar? O que posso fazer em vez disso?
DavidPostill