Como listar todos os arquivos ordenados por tamanho

225

Eu gostaria de listar todos os arquivos na ordem de tamanho grande a pequeno e os arquivos podem estar presentes em qualquer lugar em uma determinada pasta.

    
por Joe 03.11.2012 / 16:21

10 respostas

264

Use simplesmente algo como:

ls -lS /path/to/folder/

Capital S .

Isso classificará os arquivos por tamanho.

Veja também:

man ls

-S     sort by file size

Se você quiser classificar na ordem inversa , basta adicionar -r switch.

Atualização:

Para excluir diretórios (e desde que nenhum dos nomes de arquivo ou alvos de links simbólicos contenha caracteres de nova linha):

ls -lS | grep -v '^d' 

Atualização 2:

Eu vejo agora como ainda mostra links simbólicos, que podem ser pastas. Os links simbólicos sempre começam com uma letra l, como no link.

Altere o comando para filtrar por - . Isso deve deixar apenas arquivos regulares:

ls -lS | grep '^-'

No meu sistema, isso mostra apenas arquivos regulares.

atualização 3:

Para adicionar recursão, deixo a classificação das linhas para o comando sort e digo para usar a quinta coluna para classificar.

ls -lR | grep '^-' | sort -k 5 -rn

-rn significa reverso e numérico para obter os maiores arquivos no topo. O lado negativo desse comando é que ele não mostra o caminho completo dos arquivos.

Se você precisar do caminho completo dos arquivos, use algo assim:

find . -type f  -exec du -h {} + | sort -r -h

O comando find localizará recursivamente todos os arquivos em todos os sub-diretórios de . e chamará du -h (significando uso de disco -humanreadable ) e então ordenará a saída novamente. Se o seu find / sort não suportar -h , substitua por du -k e sort -rn . Note que tamanho e uso de disco não são a mesma coisa.

    
por 03.11.2012 / 16:27
23

Você pode usar algo como localizar e classificar.

find . -type f -ls | sort -r -n -k7

(a opção -ls não é padrão, mas é encontrado em muitas implementações de encontrar, não só a GNU um. Em GNU encontrar e outros, ele exibe algo semelhante a ls -li , com algumas exceções, por exemplo, arquivos com ACLs não estão marcadas com um +)

Se os nomes dos arquivos puderem conter caracteres de nova linha, com o GNU find e o GNU sort:

find . -type f -ls -printf '
find . -type f -ls | sort -r -n -k7
' | sort -zk7rn | tr -d '
find . -type f -ls -printf '%pre%' | sort -zk7rn | tr -d '%pre%'
'
    
por 03.11.2012 / 19:33
9

Com zsh e GNU ls:

ls -ldU -- **/*(.OL)

Em que (.OL) é um qualificador glob , . para selecionar apenas arquivos regulares , OL para ordem inversa por tamanho (tamanho do arquivo, o para ordem crescente, O para decrescente).

(note que versões mais antigas do zsh tiveram problemas com tamanhos de arquivo superiores a 2 ^ 32).

Alguns sistemas operacionais têm um limite no tamanho da lista de argumentos passada para um comando. Nesses casos, você precisaria:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Se você quiser apenas a lista de arquivos e não a saída detalhada, faça:

print -rl -- **/*(.OL)

Se você deseja incluir arquivos ocultos (cujo nome começa com um ponto, exceto . e .. ) e pesquisar em diretórios ocultos, adicione o qualificador D globbing:

print -rl -- **/*(.DOL)
    
por 03.11.2012 / 17:49
8

Listar arquivos por tamanho crescente seria:

ls -lSr

As opções são:

  • l: long, mostra usuário detalhado, grupo, outros atributos, data, etc.
  • S: lista de pedidos por tamanho (decrescente por padrão)
  • r: inverte a ordem da listagem
por 29.06.2016 / 20:28
6

Dizer que "os arquivos podem estar presentes em qualquer lugar de uma determinada pasta" implica que você deseja recursivamente descer todos os diretórios (pastas) dentro do diretório inicial (pasta). Isto é o que o find pretende fazer:

find . -type f -exec ls -lSd {} +

Isso "encontra" todos os arquivos no diretório de trabalho atual ( . ). Para cada arquivo encontrado, um processo ls é executado para classificar os objetos encontrados na ordem de tamanho. O + terminator para o -exec faz com que vários argumentos sejam passados como uma lista para ls . A menos que o seu diretório (pasta) contenha um grande número de arquivos, você deve ter uma lista (e, portanto, um processo bifurcado), levando ao resultado desejado.

    
por 03.11.2012 / 19:30
3

Exibição da lista de arquivos na ordem inversa: ls -lSrh

Para ordem crescente: ls -lSh

    
por 13.06.2016 / 12:54
2

Eu escrevi algo a este ponto um tempo atrás. Você poderia passar um argumento para especificar quantos arquivos para listar, ou apenas digitar big , caso você tenha 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
    
por 04.11.2012 / 04:30
2

Tente isso, funciona bem para mim.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Resposta não perfeita, mas funciona até certo ponto

$ ls -lS |grep  '^-' | head -n 6 
    
por 01.06.2015 / 05:00
1

Adicionando a resposta de Delh e o comentário de Stéphane Chazelas ...

find -print0 combinado com xargs -0 adiciona suporte para espaços em branco / espaços / whatnots.

du -h | sort -rn não classifica corretamente entre diferentes múltiplos de bytes, por exemplo 1.1M será mostrado após 128K, o que está errado.

sort -rh (--human-numeric-sort) cuida disso, mas funciona apenas na versão do GNU.

Os comandos abaixo fornecerão a saída desejada.

Human-readable, no tipo do GNU / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

Em unidades de kilobyte, em BSD / OSX / outros:

find . -type f -print0 | xargs -0 du -k | sort -rn

Para o BSD / OSX, consulte também o link .

    
por 04.09.2015 / 22:07
0

Como uma variação da pergunta original, se você quiser ver o tamanho cumulativo dos arquivos nos subdiretórios:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Os tamanhos serão exibidos em megabytes (o m em du -sm ). Outros valores aceitos por du são -k para kilobytes, -g para gigabytes. Usar -h para exibição legível por humanos não é possível porque irá quebrar a classificação.

Aqui está uma versão que usa sed para anexar o M para megabytes:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/M/g'

O diretório a ser exibido é definido via ${1:-.} , que usará o primeiro argumento de linha de comando, se fornecido, ou usará o diretório atual, se chamado, sem argumentos.

NOTA: Isso pode levar muito tempo com muitos arquivos. A opção -type d listará apenas os subdiretórios e excluirá os arquivos na pasta atual; Se você também quiser ver os arquivos na pasta atual, remova-os.

    
por 24.07.2016 / 12:19

Tags