Classifique os arquivos no diretório recursivamente com base na data da última modificação

11

Classifique os arquivos no diretório recursivamente com base na data da última modificação

Modifiquei muitos arquivos no meu diretório e quero saber o que são esses arquivos, classificando-os até a data da última modificação e por isso quero que algumas extensões sejam excluídas

no diretório svn, também tenho muitos arquivos .svn que não quero mostrar no tipo

Danny
fonte
Demonstro como excluir a extensão na minha resposta.
precisa saber é o seguinte

Respostas:

18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

lhe dará algo como

2014-03-31 04: 10: 54.8596422640 ./foo 2014-04-01
01: 02: 11.9635521720 ./bar

n.st
fonte
I pode excluir uma extensão de arquivo a partir da pasta ....
Danny
@Danny Sim, isso é fácil com Pesquisa: find -not -iname '*.ext'.
n.st
encontrar -não -caminho " svn " -não -name "* svn" -printf "% TY-% TM-% Td% TT% p \ n" | tipo -n este é exatamente o que eu precisava muito obrigado @ n.st
Danny
5

Se você deseja nivelar a estrutura de diretórios (classificando assim a data em todos os arquivos em todos os diretórios, ignorando em qual diretório os arquivos estão), a findabordagem sugerida por @yeti é o caminho a seguir. Se você deseja preservar a estrutura de diretórios, tente

$ ls -ltR /path/to/directory

que classifica o diretório com base.

Andreas Wiese
fonte
1
isso dá-me pasta sábio onde, como o que eu preciso é todos juntos quais são os arquivos modificados recentemente
Danny
5

No bash, execute shopt -s globstarprimeiro. No ksh93, execute set -o globstarprimeiro. No zsh, você já está definido.

ls -dltr **/*

Isso retornará um erro se você tiver tantos arquivos que o limite de comprimento da linha de comando no seu sistema for excedido. No zsh, você pode usar isso:

print -rl -- **/*(Om)
Gilles 'SO- parar de ser mau'
fonte
Esta é a única resposta aqui que funciona com o Solaris 10, obrigado! :)
laxxy
3

Supondo que você esteja encontrando o GNU find, tente:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

fonte
1
Você pode usar finda -printfopção para evitar a chamada de um processo separado (ou vários, dependendo do número de arquivos). Veja minha resposta para um exemplo.
n.st
1
Sabendo que existem outras maneiras de fazer isso, eu queria dar statuma chance e mostrar -exec ... +. Realmente! Às vezes eu penso, statmerece mais atenção ... e ninguém deve levar receitas de aqui sem ler sobre os ingredientes e pensar sobre as conseqüências ...
Btw ... nem todo achado tem -printf...
1
@ yeti - Se o seu findnão tiver -printf, você pode usar -exec sh -c 'printf...'para obter muitas das mesmas funcionalidades. Isso incluiria acesso também a $(pwd)caminhos totalmente qualificados.
mikeserv
2
Eu conheci muitos usuários de linux que nunca leram stat. Então, às vezes eu só quero dirigir alguma atenção em stat... Eu acho que statmerece ...
2

Para listar com robustez os nomes de arquivos usando apenas as ferramentas GNU recentes:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
fonte
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Isso evita qualquer problema na lista de argumentos, porque o único argumento que lsserá recebido será o nome do diretório que você deseja listar. Você pode fazer isso com o que quiser.

O shell apenas . sourceso |pipecomo um script shell - é o mesmo processo e não tem os problemas que você pode encontrar quando execveé chamado.

Em todo o caso - o acima exposto apenas atinge três níveis de profundidade, que é ajustável alterando maxdepth. Também é profundo primeiro - para que você trabalhe de volta para o diretório atual a partir de depth.

Você pode notar que também recebe $LSCOLORS- na minha máquina, ele também fornece colunas bem impressas e tudo o mais que você deseja ls- ou, nesse caso, qualquer coisa que você possa imaginar que gostaria de fazer com. source.

SEM SVN

Novamente, isso fará o que você espera ls. Portanto, ocultar .svnarquivos é tão simples quanto alterar a lslinha para:

ls -t --color=always --hide="*svn" "%p"\n

Ou se você deseja ver as svnextensões em todas as pastas, MAS ./svnvocê pode alterá-las para que todo o comando fique assim:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Pessoalmente, gosto de sl -se, se você se importa, -uclassificará por tempo de acesso em vez de tempo mod.

mikeserv
fonte
1

Este irá listar todos files em <dir>com nível superior ser modificado mais antiga

find <dir> -type f -print0 | xargs -0 ls -ltr

E com isso, a última modificação é a mais alta

find <dir> -type f -print0 | xargs -0 ls -lt

Observe que isso só funciona se a lista de nomes de arquivos não exceder o limite total de comprimento da linha de comando no seu sistema.

UnX
fonte
verdade, eu esqueci disso
UNX
para referência sobre comando: lista arg muito longo in-ulm.de/~mascheck/various/argmax
UNX
@ Gilles: Você quer dizer xargs -0(em ambos os casos).  xargs -print0é equivalente a xargs -p -r -i -n -t -0ou xargs -inprt0ou xargs -0ntrip, o que provavelmente não é o que você quis dizer.
Scott