Como listar todos os arquivos ordenados por tamanho

241

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

Joe
fonte
5
De man ls:-S sort by file size
ctrl-alt-delor
Você quer dizer "os arquivos estão neste diretório" ou "os arquivos podem estar em qualquer subdiretório".
Ctrl-alt-delor
Se você é capaz / deseja usar uma ferramenta GUI, dê uma olhada no QDirStat , anteriormente KDirStat .
RhinoDevel 26/03/19

Respostas:

290

Basta usar 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ê deseja classificar na ordem inversa , basta adicionar -rswitch.

Atualizar:

Para excluir diretórios (e desde que nenhum nome de arquivo ou destino de link simbólico contenha caracteres de nova linha):

ls -lS | grep -v '^d' 

Atualização 2:

Agora vejo como ele ainda mostra links simbólicos, que podem ser pastas. Links simbólicos sempre começam com a letra l, como no link.

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

ls -lS | grep '^-'

No meu sistema, isso mostra apenas arquivos regulares.

atualização 3:

Para adicionar recursão, eu deixaria a classificação das linhas sob o sortcomando e pedia para ele usar a 5a coluna para classificar.

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

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

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

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

O findcomando encontrará recursivamente todos os arquivos em todos os subdiretórios .e chamada du -h(significando o uso do disco -humanreadable ) e, em seguida, classificará a saída novamente. Se o seu find/ sortnão suportar -h, substitua por du -ke sort -rn. Observe que tamanho e uso do disco não são a mesma coisa.

delh
fonte
5
dufornece o uso do disco que é diferente do tamanho do arquivo. Com (GNU) du -h, a classificação numérica não funcionará (você precisará da -hopção GNU para classificar). O xargs espera uma lista de possíveis palavras entre aspas como entrada, para que não funcione se os nomes de arquivos contiverem espaços em branco ou caracteres entre aspas.
Stéphane Chazelas
1
Vejo que -S ordem decrescente de tamanho, e a ordem crescente?
precisa saber é o seguinte
3
Seguindo @ StéphaneChazelas, isso funciona para mim: find . -type f -print0 | xargs -0 du -h | sort -rh. Se você quer apenas dizer que os 30 maiores arquivos: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
User7543 16/05
Oi! Você poderia explicar a + |sintaxe em + | sort -r -h?
Victor
@ Victor, consulte unix.stackexchange.com/questions/195939/… .
Hew Wolff
25

Você pode usar algo como encontrar e classificar.

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

(a -lsopção não é padrão, mas é encontrada em muitas implementações de localização, não apenas na GNU. No GNU find e em outras, ela exibe algo semelhante a ls -lialgumas exceções, por exemplo, arquivos com ACLs não são marcados 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 '\0' | sort -zk7rn | tr -d '\0'
Mark Cohen
fonte
Isso pressupõe que a coluna "group" (de -ls) não contém espaços (portanto, o parâmetro -k 7), mas não é necessariamente o caso.
Kolistivra
1
por que não simplesmente encontrar find ... -print0 | classificar -zk7rn0?
Andre de Miranda
10

Com zsh e GNU ls:

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

Onde (.OL)está um qualificador global , .para selecionar apenas arquivos regulares , OLpara inverter a ordem pelo comprimento (tamanho do arquivo, o por ordem crescente, Opor decrescente).

(observe que as versões mais antigas do zsh tinham problemas com tamanhos de arquivo acima de 2 ^ 32).

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

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

Se você deseja apenas a lista de arquivos e não a saída detalhada, basta:

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

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

print -rl -- **/*(.DOL)
Stéphane Chazelas
fonte
o que .OLfaz? Isso faz parte do comando?
alpha_989
@ alpha_989, consulte edit #
Stéphane Chazelas
Obrigado pela explicação, Stephane .. No entanto, por algum motivo .. o comando não funciona na minha estação de trabalho .. Estou usando ls (GNU coreutils) 8.25e zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Funciona apenas para determinadas versões de lse zsh?
31418 jQuery
@ alpha_989, de que maneira isso não funciona para você? Funciona para mim com essas mesmas versões e não há nada nesse código que não teria funcionado nas versões de 15 anos atrás, pelo menos.
Stéphane Chazelas
9

Os arquivos de lista por tamanho crescente serão:

ls -lSr

As opções são:

  • l: long, mostra usuário detalhado, grupo, outros atributos, data, etc.
  • S: pedidos listados por tamanho (decrescente por padrão)
  • r: reverte a ordem da listagem
padeiro
fonte
Você se importaria de explicar as opções para melhorar a qualidade da resposta?
Rui F Ribeiro
6

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

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

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

JRFerguson
fonte
1
isso é bom, pois permite que você use o modificador -h on ls para mostrar tamanhos de arquivo agradáveis
shmish111
4

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

Para ordem crescente: ls -lSh

user174839
fonte
1
+1 para usar o sinalizador -h para saída amigável ao ser humano.
computingfreak
2

Escrevi algo nessa extensão há um tempo. Você pode passar um argumento para especificar quantos arquivos listar, ou apenas digitar big, caso em que você obtém 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}
Emanuel Berg
fonte
2

Experimente estes, 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 }'

Não é uma resposta perfeita, mas funciona até certo ponto

$ ls -lS |grep  '^-' | head -n 6 
Sand1512
fonte
1
O awk funciona bem se os nomes de arquivos não contiverem espaços.
Eir Nym
sim .. use 'sed' e substitua espaço por sublinhado? se isso ajuda
Sand1512
Não, eu uso sedpara reduzir a produção
Eir Nym
1

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

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

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

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

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

Legível por humanos, no tipo GNU / Linux:

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

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

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

Para BSD / OSX, consulte também https://unix.stackexchange.com/a/188375/82895 .

djule5
fonte
1

Como uma variação da pergunta original, se você deseja 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 mno du -sm). Outros valores aceitos por dusão -kpara kilobytes, -gpara gigabytes. -hNão é possível usar para exibição legível por humanos, pois isso interromperá a classificação.

Aqui está uma versão usada sedpara anexar o Mmegabyte:

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

O diretório a ser exibido é definido por meio do ${1:-.}qual usará o primeiro argumento da linha de comandos, se fornecido, ou usará o diretório atual se for chamado sem argumentos.

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

Nota: você pode usar o ncduque está disponível na maioria dos repositórios linux (no ubuntu / debian apt install ncdu) e também no osx ( brew install ncdu).

ccpizza
fonte