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.
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?
(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:
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:
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)
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.
+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
}
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).
man ls
:-S sort by file size
Respostas:
Basta usar algo como:
Capital S .
Isso classificará os arquivos por tamanho.
Veja também:
man ls
Se você deseja classificar na ordem inversa , basta adicionar
-r
switch.Atualizar:
Para excluir diretórios (e desde que nenhum nome de arquivo ou destino de link simbólico contenha caracteres de nova linha):
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:No meu sistema, isso mostra apenas arquivos regulares.
atualização 3:
Para adicionar recursão, eu deixaria a classificação das linhas sob o
sort
comando e pedia para ele usar a 5a coluna para classificar.-rn
significa 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:
O
find
comando encontrará recursivamente todos os arquivos em todos os subdiretórios.
e chamadadu -h
(significando o uso do disco -humanreadable ) e, em seguida, classificará a saída novamente. Se o seufind
/sort
não suportar-h
, substitua pordu -k
esort -rn
. Observe que tamanho e uso do disco não são a mesma coisa.fonte
du
fornece 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-h
opçã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.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
.+ |
sintaxe em+ | sort -r -h
?Você pode usar algo como encontrar e classificar.
(a
-ls
opçã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 als -li
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 o GNU find e o GNU sort:
fonte
Com zsh e GNU ls:
Onde
(.OL)
está um qualificador global ,.
para selecionar apenas arquivos regulares ,OL
para inverter a ordem pelo comprimento (tamanho do arquivo,o
por ordem crescente,O
por 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:
Se você deseja apenas a lista de arquivos e não a saída detalhada, basta:
Se você deseja incluir arquivos ocultos (cujo nome começa com um ponto, exceto
.
e..
) e pesquisar também em diretórios ocultos, adicione oD
qualificador de globbing:fonte
.OL
faz? Isso faz parte do comando?ls (GNU coreutils) 8.25
ezsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Funciona apenas para determinadas versões dels
ezsh
?Os arquivos de lista por tamanho crescente serão:
As opções são:
fonte
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
se pretende fazer: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-exec
faz com que vários argumentos sejam passados como uma lista parals
. 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.fonte
Exibição da lista de arquivos na ordem inversa:
ls -lSrh
Para ordem crescente:
ls -lSh
fonte
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.fonte
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
fonte
sed
para reduzir a produçãoAdicionando a resposta de delh e o comentário de Stéphane Chazelas ...
find -print0
combinado comxargs -0
adiciona 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 .
fonte
Como uma variação da pergunta original, se você deseja ver o tamanho cumulativo dos arquivos nos subdiretórios:
Os tamanhos serão exibidos em Megabytes (o
m
nodu -sm
). Outros valores aceitos pordu
são-k
para kilobytes,-g
para gigabytes.-h
Não é possível usar para exibição legível por humanos, pois isso interromperá a classificação.Aqui está uma versão usada
sed
para anexar oM
megabyte: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 d
listará apenas subdiretórios e excluirá arquivos na pasta atual; se você também quiser ver os arquivos na pasta atual, remova-o.fonte