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.


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-

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).


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.


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!)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.