Classificando arquivos de acordo com o tamanho recursivamente

63

Eu preciso encontrar os maiores arquivos em uma pasta.
Como escaneio uma pasta recursivamente e classifico o conteúdo por tamanho?

Eu tentei usar ls -R -S , mas isso também lista os diretórios.
Eu também tentei usar find .

    
por user2179293 24.08.2013 / 17:59

9 respostas

77

Você também pode fazer isso com apenas du . Apenas para estar no lado seguro, estou usando esta versão do du :

$ du --version
du (GNU coreutils) 8.5

A abordagem:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

Divisão da abordagem

O comando du -ah DIR produzirá uma lista de todos os arquivos e diretórios em um determinado diretório DIR . O -h produzirá tamanhos legíveis que eu prefiro. Se você não quiser, desative essa opção. Estou usando o head -6 apenas para limitar a quantidade de saída!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

Fácil o suficiente para classificá-lo do menor para o maior:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

Inverta, do maior para o menor:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

Não me mostre o diretório, apenas os arquivos:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

Se você quiser apenas a lista do menor para o maior, mas os seis principais arquivos incorretos, é possível inverter a troca de classificação, descartar ( -r ) e usar tail -6 em vez de head -6 .

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books
    
por 24.08.2013 / 18:55
16

Se você quiser encontrar todos os arquivos no diretório atual e seus subdiretórios e listá-los de acordo com seu tamanho (sem considerar seu caminho), e assumindo que nenhum dos nomes de arquivo contém caracteres de nova linha, com GNU find , pode fazer isso:

find . -type f -printf "%s\t%p\n" | sort -n

De man find em um sistema GNU:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  '\'  escapes and '%' directives.
          Field widths and precisions can  be  specified
          as  with the 'printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the '-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

De man sort :

   -n, --numeric-sort
          compare according to string numerical value
    
por 24.08.2013 / 18:12
9

Tente o seguinte comando:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Ele listará os 20 maiores arquivos no diretório atual de forma recursiva.

Observação: a opção -h para sort não está disponível no OSX / BSD, portanto, instale sort de coreutils (por exemplo, via brew ) e aplique o caminho da lixeira local a PATH , eg

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Como alternativa, use:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

Para os maiores diretórios, use du , por exemplo:

du -ah . | sort -rh | head -20

ou:

du -a . | sort -rn | head -20
    
por 05.03.2015 / 15:10
7

Isso localizará todos os arquivos recursivamente e os classificará por tamanho. Ele imprime todos os tamanhos de arquivo em kb e arredonda para baixo, portanto, você pode ver arquivos de 0 KB, mas estava perto o suficiente para meus usos e funciona no OSX.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1

    
por 16.05.2015 / 00:01
3

Com zsh , você encontraria o maior arquivo (em termos de tamanho aparente, como a coluna de tamanho em ls -l output, não uso de disco) com:

ls -ld -- **/*(DOL[1])

Para os 6 maiores:

ls -ld -- **/*(DOL[1,6])

Para classificá-los por tamanho de arquivo, você pode usar a opção ls do -S . Algumas implementações ls também têm uma opção -U para ls não classificar a lista (já que ela é classificada por tamanho por zsh aqui).

    
por 24.08.2013 / 19:33
3

Solução simples para Mac / Linux que ignora diretórios:

find . -type f -exec du -h {} \; | sort -h
    
por 17.07.2018 / 12:25
2

O equivalente em BSD ou OSX é

$ du -ah simpl | sort -dr | head -6
    
por 18.11.2014 / 05:27
0

Essa é uma necessidade incrivelmente comum por vários motivos (gosto de encontrar o backup mais recente em um diretório) e é uma tarefa surpreendentemente simples.

Vou fornecer uma solução Linux que usa os utilitários find, xargs, stat, tail, awk e sort.

A maioria das pessoas forneceu algumas respostas exclusivas, mas eu prefiro o meu porque ele lida corretamente com nomes de arquivos, e o caso de uso pode ser facilmente alterado (modificar stat e classificar argumentos)

Também forneço uma solução Python que permita usar essa funcionalidade mesmo no Windows

Solução de linha de comando do Linux

Retorna recursivamente a lista inteira de apenas arquivos de um diretório, classificado por tamanho de arquivo

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

O mesmo que antes, mas desta vez, retorne o maior arquivo.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

Mesmo padrão exato, mas agora selecione o arquivo mais novo em vez do maior

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

Explicação:

  1. find: Localiza recursivamente todos os arquivos do diretório atual e os imprime com um caractere nulo
  2. xargs: utilitário para executar comandos usando argumentos fornecidos a partir da entrada padrão. Para cada linha de saída, queremos executar o utilitário stat nesse arquivo
  3. stat: Stat é um comando incrível que tem tantos casos de uso. Estou imprimindo duas colunas, a primeira coluna sendo o tamanho do bloco (% s), e a segunda coluna sendo o nome do arquivo (% n)
  4. sort: classifica os resultados com o comutador numérico. Como o primeiro argumento é um inteiro, nossos resultados serão classificados corretamente
  5. tail: Selecione apenas a última linha de saída (já que a lista está classificada, este é o maior arquivo!)
  6. awk: selecione a segunda coluna, que contém o nome do arquivo, e é o maior arquivo em um diretório recursivo.

solução Python

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

Esse script demora um pouco mais para ser explicado, mas, essencialmente, se você salvá-lo como um script, ele pesquisará o primeiro argumento fornecido na linha de comando e retornará o maior arquivo desse diretório. O script não faz nenhuma verificação de erros, mas deve dar uma idéia de como abordar isso em Python, o que lhe dá uma boa forma independente de resolver esse problema.

    
por 15.06.2018 / 12:00
-1

Algo que funciona em qualquer plataforma, exceto AIX e HP-UX, é:

find . -ls | sort +6 | tail
    
por 15.06.2018 / 10:23