desenv-web-rp.com

Como listar todos os arquivos ordenados por tamanho

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.

268
Joe

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 em ordem inversa , basta adicionar -r interruptor.

Atualização:

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.

Altere o comando para filtrar por um -. 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 no comando sort e diria para ele 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. A desvantagem 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 comando find encontrará recursivamente todos os arquivos em todos os subdiretórios de . e chame du -h (significado uso do disco -humanizável) e classifique a saída novamente. Se o seu find/sort não suportar -h, substituir com du -k e sort -rn. Observe que tamanho e uso do disco não são a mesma coisa.

308
delh

Você pode usar algo como encontrar e classificar.

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

(a -ls opção não é padrão, mas é encontrada em muitas implementações de localização, não apenas na GNU uma. Em GNU find e outras, ela exibe algo semelhante a ls -li com algumas 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 GNU find e GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
26
Mark Cohen

Com zsh e GNU ls:

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

Onde (.OL) é um qualificador de globos glob , . para selecionar apenas arquivos regulares , OL para inverter a ordem pelo comprimento (tamanho do arquivo, o para a ordem crescente , O para 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 pesquise nos diretórios ocultos, adicione o qualificador D globbing:

print -rl -- **/*(.DOL)
10
Stéphane Chazelas

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
9
Baker

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 find deve fazer:

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

Isso "localiza" todos os arquivos no diretório de trabalho atual (.). Para cada arquivo encontrado, um processo ls é executado para classificar os objetos encontrados em ordem de tamanho. O + terminador para o -exec faz 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.

7
JRFerguson

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 
4
Sand1512

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

Para ordem crescente: ls -lSh

4
user174839

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 obtém 10.

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

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

find -print0 combinado com xargs -0 adiciona suporte a 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á 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 .

1
djule5

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 m em du -sm). Outros valores aceitos por du são -k para kilobytes, -g para gigabytes. Usando -h para exibição legível por humanos não é possível porque isso interromperá a classificação.

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

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 ${1:-.} que usará o primeiro argumento da 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 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 ncdu que está disponível na maioria dos repositórios linux (no ubuntu/debian apt install ncdu), bem como no osx (brew install ncdu).

1
ccpizza