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

11

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

Eu modifiquei muitos arquivos em meu diretório para saber quais são esses arquivos classificando-os pela última data de modificação e em que eu quero que algumas das extensões sejam excluídas

no diretório svn eu tenho muitos arquivos .svn que eu não quero mostrar no tipo

    
por Danny 01.04.2014 / 19:41

7 respostas

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

lhe dará algo parecido com

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

    
por 02.04.2014 / 01:52
5

Se você quiser nivelar a estrutura de diretórios (classificando por data todos os arquivos em todos os diretórios, ignorando em qual diretório os arquivos estão), o caminho find sugerido por @yeti é o caminho a ser seguido. Se você quiser preservar a estrutura do diretório, tente

$ ls -ltR /path/to/directory

que classifica o diretório com base.

    
por 01.04.2014 / 19:57
4

No bash, execute shopt -s globstar primeiro. No ksh93, execute set -o globstar primeiro. Em 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 é excedido. Em zsh, você pode usar isso:

print -rl -- **/*(Om)
    
por 02.04.2014 / 01:23
3

Supondo que você esteja acostumado a encontrar o GNU, tente:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n
    
por 01.04.2014 / 19:52
2

Para listar robustamente os nomes de arquivos usando apenas ferramentas GNU recentes:

find . -printf '%A@ %p
find . -printf '%A@ %p%pre%' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '%pre%' '\n'
' | sort -nz | sed -z 's/^[^ ]* //' | tr '%pre%' '\n'
    
por 02.04.2014 / 02:06
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 ls irá receber o nome do diretório que você deseja listar. Você pode fazer isso com o que quiser.

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

Em qualquer caso - o acima só vai de três profundidades, o que é ajustável, alterando maxdepth . Também em primeiro lugar - para que você volte ao seu diretório atual em depth .

Você pode perceber que também obtém $LSCOLORS - em minha máquina também fornece colunas bem impressas e tudo mais que você deseja de ls - ou, para que importa, qualquer coisa que você possa imaginar que você gostaria de fazer com . source.

NÃO SVN

Novamente, isso fará o que você espera de ls . Então, ocultar .svn arquivos é tão simples quanto alterar ls linha para:

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

Ou se você quiser ver as extensões svn em todas as pastas, MAS ./svn você pode alterá-lo para que o comando inteiro seja 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 dele com -s e, se você se importa, -u classificará por tempo de acesso em vez de tempo de mod.

    
por 02.04.2014 / 06:00
1

Este listará todos os files em <dir> sendo o mais antigo modificado

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

E com isso, o mais recente modificado é o mais importante

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 em seu sistema.

    
por 02.04.2014 / 00:45