Lista de arquivos maiores que {size} ordenados por data

20

Eu quero resolver o problema 'listar os 10 arquivos mais recentes no diretório atual com mais de 20MB'.

Com ls , posso fazer:

ls -Shal |head

para obter os 10 maiores arquivos e:

ls -halt |head

para obter os 10 arquivos mais recentes

Com o achado que posso fazer:

find . -size +20M

Para listar todos os arquivos com mais de 20 MB no diretório atual (e nos subdiretórios, que eu não quero).

Existe alguma maneira de listar os dez arquivos mais recentes em um determinado tamanho, de preferência usando ls ?

    
por EoghanM 13.09.2011 / 12:55

6 respostas

18

A opção "diretório atual" para find é -maxdepth 1 . Toda a linha de comando para as suas necessidades é:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

ou

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
    
por 13.09.2011 / 13:52
6

Nota: Isso funcionará para o GNU-find, mas não para todos os outros.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Começando como @Rajish, mas usando o comando printf de find para especificar o formato de saída. Existem 3 formatos relacionados a tempo, atime, ctime e mtime - %T é para mtime, %A e %C são para os outros formatos.

@ é para especificar o formato de tempo em segundos desde a época. %f é para o nome do arquivo, \n para uma nova linha entre 2 arquivos.

Em seguida, a classificação por número em ordem inversa fornece os arquivos mais novos primeiro e nós pegamos 20 linhas¹ com head .

No final, sed é usado para eliminar as informações de tempo.

¹) como head trabalha linha por linha, um único arquivo com mais de 20 novas linhas no nome, o que é um pouco incomum, mas não proibido, pode corromper a saída se ela pertencer às 20 primeiras correspondências. Se você tiver esses arquivos, por favor, tente se livrar deles - bem, para mudar o nome deles. Eles costumam ser um problema para scripts simples.

    
por 13.09.2011 / 15:43
4
Os qualificadores do Zsh tornam isso fácil. O qualificador . seleciona apenas arquivos regulares, Lm+20 seleciona arquivos com pelo menos 20 MB mais um byte; para incluir arquivos com exatamente 20 MB, use L+20971519 . Em seguida, om classificará diminuindo o tempo de modificação e [1,10] restringirá a expansão às primeiras 10 correspondências. Você ainda precisa da opção -t para ls se quiser listar os arquivos por data; ou você pode passar os arquivos para algum outro comando (o mais novo primeiro). Para passar os arquivos para outro comando com o arquivo mais antigo primeiro, use Om para classificar aumentando o tempo de modificação e [-10,-1] para extrair as últimas 10 correspondências.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
    
por 14.09.2011 / 01:52
1

Acho que essa pode ser a melhor maneira de resolver o problema ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Para se livrar de qualquer erro enquanto o find tenta acessar arquivos que você não tem permissão para ler, talvez queira adicionar

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 
    
por 11.09.2014 / 19:53
0

Isso imprimirá apenas os 10 arquivos especificados, independentemente de quaisquer caracteres de nova linha incorporados nos nomes dos arquivos. Usa o sistema de arquivos inodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done
    
por 13.09.2011 / 17:45
0

Obrigado por todas as respostas. O que eu tenho procurado é o seguinte:

ls -halt | grep "M " |head

Embora ele esqueça os 20 Megabytes em favor de qualquer coisa acima de um megabyte (e abaixo de um gigabyte), é fácil lembrar e preservar o elemento legível por humanos dos arquivos.

    
por 14.09.2011 / 21:58

Tags