Encontrando o maior arquivo recursivamente

38

Estou tentando encontrar o maior arquivo em um diretório recursivamente. Se houver um subdiretório dentro desse diretório, a função precisa entrar nesse diretório e verificar se o arquivo maior está lá. Quando o arquivo maior for encontrado, a saída será exibida com o nome do caminho relativo e o nome e tamanho do arquivo maior.

EX:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

Isso é o que eu tenho:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

Eu tenho ficado preso por um tempo agora. Não consigo implementar isso canalizando várias ferramentas Unix existentes. Qualquer ideia seria legal!

    
por user2419571 29.09.2014 / 22:08

4 respostas

48

use find (assumindo o GNU find ) para gerar nomes de arquivo com o tamanho do arquivo. ordenar. imprima o maior deles.

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

Isso pressupõe que os caminhos de arquivo não contêm caracteres de nova linha.

Usando um loop em bash com a implementação GNU de stat :

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

Isso será significativamente mais lento que a solução de localização. Isso também pressupõe que os nomes de arquivos não terminem em caracteres de nova linha e irão ignorar arquivos ocultos e não descer para diretórios ocultos.

Se houver um arquivo chamado - no diretório atual, o tamanho do arquivo aberto no stdin será considerado.

Tenha em atenção que as versões de bash anteriores a 4.3 seguiram ligações simbólicas ao descer a árvore de directórios.

    
por 29.09.2014 / 22:14
8

Este comando também ajuda a listar o tamanho definido.

find . -type f -size +100M -exec ls -lh {} \;
    
por 15.06.2017 / 19:27
4

Isso funciona no BSD / macOS:

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

Você também pode acrescentar | head -n 3 para exibir um número de entradas interessantes (3 neste caso).

    
por 15.06.2017 / 19:36
2

Com zsh , para o maior arquivo normal:

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

(é claro que você pode substituir ls -ld -- por qualquer comando. Se estiver usando o GNU ls ou compatível, veja também a opção -h para tamanhos legíveis )

  • . : apenas arquivos regulares (não diretórios, links simbólicos, dispositivos, fifos ...)
  • D : inclua os ocultos e desça em diretórios ocultos
  • OL : ordem inversa por tamanho ( L inth).
  • [1] : apenas a primeira correspondência.

Se houver empates, você terá um deles aleatoriamente. Se você quiser o primeiro em ordem alfabética, adicione um extra on ( o rder por n ame) para ordenar os links alfabeticamente.

Note que considera o tamanho dos arquivos, não o uso do disco.

    
por 20.11.2017 / 18:11