Listar arquivos maiores que {size} classificados por data

27

Quero resolver o problema 'liste os 10 arquivos mais recentes do diretório atual com mais de 20 MB'.

Com lseu posso fazer:

ls -Shal |head

para obter os 10 principais arquivos maiores e:

ls -halt |head

para obter os 10 arquivos mais recentes

Com o achado eu posso fazer:

find . -size +20M

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

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

EoghanM
fonte

Respostas:

24

A opção 'diretório atual' para findé -maxdepth 1. Toda a linha de comando para 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
Rajish
fonte
8

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 printfcomando from findpara especificar o formato de saída. Existem três formatos relacionados a tempo , atime, ctime e mtime - %Té para mtime %Ae %Csão para os outros formatos.

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

Em seguida, classificar por número na ordem inversa fornece primeiro os arquivos mais novos e levamos 20 linhas¹ head.

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

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

Usuário desconhecido
fonte
11
Se você usar file's -lscomando, os caracteres especiais serão impressos como caracteres escapou-barra invertida: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Além disso, o formato será parecido com o ls -lEoghanM, também especificado de -lqualquer maneira.
manatwork
printfsó funciona para distribuições GNU específicas.
Brethlosze # 28/17
%T+gera data e hora legíveis pelo ser humano como 2018-11-06+13:37:54.4606466460o que também são classificáveis por sort(sem -n), ver: unix.stackexchange.com/questions/29899/...
Ciro Santilli新疆改造中心法轮功六四事件
5

Os qualificadores Glob do Zsh facilitam isso. O .qualificador seleciona apenas arquivos regulares, Lm+20seleciona arquivos com pelo menos 20 MB mais um byte; para incluir arquivos com exatamente 20 MB, use L+20971519. Em seguida, omclassifica diminuindo o tempo de modificação e [1,10]restringe a expansão às 10 primeiras correspondências. Você ainda precisa da -topção lsse deseja listar os arquivos por data; ou você pode passar os arquivos para algum outro comando (o mais jovem primeiro). Para passar os arquivos para outro comando com o arquivo mais antigo primeiro, use Ompara classificar aumentando o tempo de modificação e [-10,-1]extrair as últimas 10 correspondências.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
Gilles 'SO- parar de ser mau'
fonte
2

Eu acho que essa pode ser uma maneira melhor de resolver o problema ...

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

Para se livrar de qualquer erro ao encontrar tentativas de acessar arquivos que você não tem permissão para ler, você pode adicionar

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 
Dominic Williams
fonte
1

Isso imprimirá apenas os 10 arquivos especificados, independentemente de quaisquer caracteres de nova linha incorporados nos nomes dos arquivos. Ele usa sistema de arquivosinodes

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
Peter.O
fonte
-1

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

ls -halt | grep "M " |head

Embora renuncie aos 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 humano do tamanho do arquivo.

EoghanM
fonte
4
Você não deve tentar analisar a saída de ls, ela mostra uma representação de arquivos, nada mais. Para nomes simples de arquivos, a saída é equivalente ao nome do arquivo, mas você não deve confiar nele.
Chris Baixo
É verdade, tenho certeza, mas em termos de usuário humano (e saída não sendo canalizada para outro lugar), é mais fácil lembrar esse, pois pode ser montado com mais facilidade a partir de ferramentas simples conhecidas tldp.org/LDP/GNU-Linux- Resumo das ferramentas / html / c1089.htm
EoghanM 25/11