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

30

Como posso obter a lista de todos os arquivos no diretório atual junto com a data de modificação deles e classificados por essa data?

Agora eu sei como conseguir isso com find , stat e sort , mas por alguma razão estranha o stat não está instalado na caixa e é improvável que eu consiga instalá-lo.

Alguma outra opção?

PS: gcc não está instalado

    
por alex 14.03.2011 / 20:01

5 respostas

26

Meu método mais curto usa zsh:

print -rl **/*(.Om)

Se você tiver o GNU find, imprima os tempos de modificação do arquivo e ordene-os. Eu suponho que não há novas linhas em nomes de arquivos.

find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'

Se você tiver o Perl (novamente, assumindo que não há novas linhas nos nomes dos arquivos):

find . -type f -print |
perl -l -ne '
    $_{$_} = -M;  # store file age (mtime - now)
    END {
        $,="\n";
        print sort {$_{$b} <=> $_{$a}} keys %_;  # print by decreasing age
    }'

Se você tem Python (novamente, assumindo que não há novas linhas nos nomes dos arquivos):

find . -type f -print |
python -c 'import os, sys; times = {}
for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime
for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'

Se você tiver acesso SSH a esse servidor, monte o diretório em sshfs em uma máquina melhor equipada:

mkdir mnt
sshfs server:/path/to/directory mnt
zsh -c 'cd mnt && print -rl **/*(.Om)'
fusermount -u mnt

Com apenas ferramentas POSIX, é muito mais complicado, porque não há uma boa maneira de encontrar o tempo de modificação de um arquivo. A única maneira padrão de recuperar os tempos de um arquivo é ls , e o formato de saída é dependente do local e difícil de analisar.

Se você pode escrever nos arquivos, e se importar apenas com arquivos regulares, e não há novas linhas em nomes de arquivos, aqui está um kludge horrível: crie hard links para todos os arquivos em um único diretório e ordene-os por modificação tempo.

set -ef                       # disable globbing
IFS='
'                             # split $(foo) only at newlines
set -- $(find . -type f)      # set positional arguments to the file names
mkdir links.tmp
cd links.tmp
i=0 list=
for f; do                     # hard link the files to links.tmp/0, links.tmp/1, …
  ln "../$f" $i
  i=$(($i+1))
done
set +f
for f in $(ls -t [0-9]*); do  # for each file, in reverse mtime order:
  eval 'list="${'$i'}         # prepend the file name to $list
$list"'
done
printf %s "$list"             # print the output
rm -f [0-9]*                  # clean up
cd ..
rmdir links.tmp
    
por 14.03.2011 / 21:05
14

Assumindo o GNU find :

find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-

Altere 1n,1 para 1nr,1 se quiser que os arquivos listados sejam os mais recentes primeiro.

Se você não tiver o GNU find , será mais difícil porque o formato do timestamp ls varia muito (os arquivos modificados recentemente têm um estilo diferente de timestamp, por exemplo).

    
por 14.03.2011 / 20:42
6

Em um mac não há argumento -printf para encontrar, mas você pode fazer isso em seu lugar:

find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'

    
por 18.02.2012 / 03:12
0

pode-se tentar isso (é preciso construí-lo) link

    
por 07.03.2014 / 11:47
0

Ignorando arquivos ocultos - com bons & carimbo de hora rápida

lida bem com espaços em nomes de arquivos - não que você deva usá-los!

$ find . -type f -not -path '*/\.*' -printf '%TY.%Tm.%Td %THh%TM %Ta %p\n' |sort -nr |head -n 10

2017.01.25 18h23 Wed ./indenting/Shifting blocks visually.mht
2016.12.11 12h33 Sun ./tabs/Converting tabs to spaces.mht
2016.12.02 01h46 Fri ./advocacy/2016.Vim or Emacs - Which text editor do you prefer?.mht
2016.11.09 17h05 Wed ./Word count - Vim Tips Wiki.mht

Mais find abundante pode ser encontrado seguindo o link.

    
por 27.01.2017 / 23:55

Tags