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.
man ls
:-S sort by file size
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.
man ls
:-S sort by file size
Respostas:
Basta usar algo como:
ls -lS /path/to/folder/
Capital S .
Isso classificará os arquivos por tamanho.
Veja também:
-S sort by file size
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):
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 sort
comando e pedia para ele usar a 5a 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 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 find
comando 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
/ sort
não suportar -h
, substitua por du -k
e sort -rn
. Observe que tamanho e uso do disco não são a mesma coisa.
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.
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. No GNU find e em outras, ela exibe algo semelhante a ls -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:
find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
Com zsh e GNU ls:
ls -ldU -- **/*(.OL)
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:
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 D
qualificador de globbing:
print -rl -- **/*(.DOL)
.OL
faz? Isso faz parte do comando?
ls (GNU coreutils) 8.25
e zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Funciona apenas para determinadas versões de ls
e zsh
?
Os arquivos de lista por tamanho crescente serão:
ls -lSr
As opções são:
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:
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 -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.
Exibição da lista de arquivos na ordem inversa: ls -lSrh
Para ordem crescente: ls -lSh
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
}
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
sed
para reduzir a produção
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 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 .
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
no du -sm
). Outros valores aceitos por du
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 o M
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 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.
Nota: você pode usar o
ncdu
que está disponível na maioria dos repositórios linux (no ubuntu / debianapt install ncdu
) e também no osx (brew install ncdu
).