Como encontrar o maior arquivo em um diretório e seus subdiretórios?


102

Estamos começando uma aula de UNIX e aprendendo vários comandos Bash. Nossa atribuição envolve a execução de vários comandos em um diretório que também possui várias pastas.

Eu sei como listar e contar todos os arquivos regulares da pasta raiz usando:

find . -type l | wc -l

Mas gostaria de saber aonde ir a partir daí para encontrar o maior arquivo em todo o diretório. Já vi dualgumas coisas a respeito de um comando, mas não aprendemos isso, então, no repertório de coisas que aprendemos, presumo que precisamos conectá-lo de alguma forma ao ls -tcomando.

E me perdoe se meu 'jargão' não estiver correto, ainda estou me acostumando!


2
Se você conhece um comando, mas não tem certeza de como usá-lo, tente digitar manseguido do comando no qual está interessado. O Up irá exibir uma boa entrada manual para esse comando (pressione qpara voltar à linha de comando).
Dunas

Respostas:


126

Citação deste link-

Se você deseja encontrar e imprimir os 10 maiores nomes de arquivos (não diretórios) em um diretório específico e seus subdiretórios

$ find . -printf '%s %p\n'|sort -nr|head

Para restringir a pesquisa ao diretório atual, use "-maxdepth 1" com find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

E para imprimir os 10 maiores "arquivos e diretórios":

$ du -a . | sort -nr | head

** Use "head -n X" em vez do único "head" acima para imprimir os X maiores arquivos (em todos os exemplos acima)


1
Por que "du -a. | Sort -nr | head" retorna o dobro do número de KB do que o tamanho real do arquivo?
xxjjnn

6
Ah, você precisa adicionar a opção 'k' ou ela mostra múltiplos de 512 bytes em vez de 1024. du -ak
xxjjnn

2
para o primeiro, como você obtém o tamanho em um formato legível por humanos?
Bluz

@Bluz eu tente substituir '%s %p\n'com '%p\n'e adicionando |xargs ls -lhao fim
Duncan X Simpson

6
A primeira solução não funcionou no OS X para mim, então acabei usando um hack rápido para filtrar os diretórios da terceira solução: du -am . | sort -nr | grep '\..*\.' | head. O mé para exibir o tamanho do arquivo em megabytes e usado greppara mostrar linhas com pelo menos dois pontos, o primeiro está no ./no caminho, o segundo está na extensão do arquivo, por exemplo .mov.
psmith de

63

Para encontrar os 25 principais arquivos no diretório atual e seus subdiretórios:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Isso produzirá os 25 principais arquivos classificando com base no tamanho dos arquivos por meio do comando piped "sort -nr -k5".

O mesmo, mas com tamanhos de arquivo legíveis por humanos:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

saídas

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Se você quiser apenas o nome do arquivo:

find . -type f | xargs ls -1S | head -n 1

Isso evita usar awke permite que você use quaisquer sinalizadores que desejar ls.

Advertência . Porque xargstenta evitar a construção de linhas de comando muito longas, isso pode falhar se você executá-lo em um diretório com muitos arquivos porque lsacaba sendo executado mais de uma vez. Não é um problema intransponível (você pode coletar a head -n 1saída de cada lsinvocação e executar ls -Snovamente, repetindo até que você tenha um único arquivo), mas prejudica um pouco essa abordagem.


desculpe xargs, eu negligenciei você +1
Steve

2
para lidar com nomes de arquivos com espaços, usefind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Isso localiza os maiores arquivos apenas no primeiro lote xargsexecutado. Para corrigi-lo adicionar classificação: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Trabalhou no OSX para mim.
psmith de

10

Não existe um comando simples disponível para descobrir os maiores arquivos / diretórios em um sistema de arquivos Linux / UNIX / BSD. No entanto, a combinação dos três comandos a seguir (usando tubos), você pode facilmente encontrar a lista dos maiores arquivos:

# du -a /var | sort -n -r | head -n 10

Se você quiser uma saída mais legível por humanos, tente:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Onde,

  • Var é o diretório que você deseja pesquisar
  • opção du command -h: tamanhos de exibição em formato legível (por exemplo, 1K, 234M, 2G).
  • du command -s option: mostra apenas um total para cada argumento (resumo).
  • opção -x do comando du: pula diretórios em sistemas de arquivos diferentes.
  • comando sort -r opção: inverter o resultado das comparações.
  • opção -h comando de classificação: compara números legíveis por humanos. Esta é apenas uma opção específica de classificação GNU.
  • comando head -10 OU opção -n 10: mostra as primeiras 10 linhas.

Eu gosto mais do segundo comando, mas no osx, nenhuma opção -h para a versão de classificação instalada. Deve ser para mac: du -hsx * | sort -rn | head -10
Yann VR

1
Amando aquele segundo comando! O melhor de todos os que tentei - vou guardá-lo para mais tarde.
CodeMouse92

Explica claramente o comando em detalhes +1
Harish

8

Isso lista os arquivos recursivamente se forem arquivos normais, classifica pelo 7º campo (que é o tamanho na minha findsaída; verifique o seu) e mostra apenas o primeiro arquivo.

find . -type f -ls | sort +7 | head -1

A primeira opção findé o caminho inicial para a pesquisa recursiva. Um tipo de fpesquisa de arquivos normais. Observe que se você tentar analisar isso como um nome de arquivo, poderá falhar se o nome do arquivo contiver espaços, novas linhas ou outros caracteres especiais. As opções sorttambém variam de acordo com o sistema operacional. Estou usando o FreeBSD.

Uma solução "melhor", mas mais complexa e mais pesada, seria findatravessar os diretórios, mas talvez usar statpara obter os detalhes sobre o arquivo e, em seguida, usar awkpara encontrar o tamanho maior. Observe que a saída de stattambém depende do seu sistema operacional.


1
O que o +7argumento deve estar fazendo? No meu tipo de máquina apenas reclama que não consegue encontrar um arquivo chamado +7.
Dunas de

@Dunes - Como eu disse, verifique a página de manual sortdo seu sistema. Estou usando o OS X 10.4 no momento, em que o uso deriva da classificação do FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Observe o +POS [-POS2]. Isso também funciona nas versões atuais do FreeBSD.
ghoti

2
Parece que você tem um programa de classificação diferente do meu. Esta é a página do manual do meu programa de classificação - linux.die.net/man/1/sort Para que isso funcione na minha máquina, você precisará usar explicitamente o -karg eg. sort -k 7. editar: no OSX 10.5, a página do manual para classificar parece ter mudado para a versão que eu tenho.
Dunas de

1
@Dunes - É tudo tipo GNU, mas versões diferentes. A [+POS1] [-POS2]notação é apenas mais antiga. Pelo que eu posso dizer, essa notação ainda é suportada pelo GNU sort moderno, embora agora que eu olhe, ela parece ter sido retirada da página de manual do sort após a versão 5.1. Você pode ver isso na página de manual do sort for FreeBSD 4.11 . Acho que não li a página de manual do sort antes do lançamento do FreeBSD 5.0!
ghoti

Além disso, observe que +POS1 contagens classificam os parâmetros de zero, enquanto as -k POS1contagens de um.
ghoti

6

Isso encontrará o maior arquivo ou pasta em seu diretório de trabalho atual:

ls -S /path/to/folder | head -1

Para encontrar o maior arquivo em todos os subdiretórios:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

Acho que o comportamento padrão do ls é listar os arquivos em colunas (ou seja, várias entradas por linha), de modo que o primeiro não encontre exatamente o maior arquivo. Com relação ao seu segundo comando, ele encontrou apenas o maior arquivo no diretório fornecido e não em seus subdiretórios.
Dunas de

@Dunes: Você está correto, o primeiro comando pode localizar diretórios, mas não por causa do comportamento padrão de ls. Em meus testes, o -Ssinalizador listará um arquivo por linha. Eu corrigi o segundo comando. Espero que agora esteja totalmente à prova. Obrigado.
Steve

4

No Solaris eu uso:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

ou

find . -type f -ls | sort -nrk7 | head -1 #unformatted

porque nada mais postado aqui não funcionou. Isso encontrará o maior arquivo em $PWDsubdiretórios e.


2

Tente o seguinte one-liner (exiba os 20 maiores arquivos):

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

ou (tamanhos legíveis):

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

Funciona bem no Linux / BSD / OSX em comparação com outras respostas, já que a -printfopção find's não existe no OSX / BSD e stattem parâmetros diferentes dependendo do sistema operacional. No entanto, o segundo comando para o trabalho em OSX / BSD adequadamente (como sortnão tem -h), instale sorta partir coreutilsou remover -ha partir lse usar sort -nrem seu lugar.

Portanto, esses aliases são úteis em seus arquivos rc :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

Isso mostra apenas o nome do arquivo sem o caminho, então realmente não ajuda a localizar o arquivo maior.
psmith de

Para mim, no topo, eu tenho arquivos realmente maiores, mas no final isso não me dá os arquivos corretos
Borislav Markov

2

Tente o seguinte comando:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Isso imprimirá o maior nome e tamanho de arquivo e mais de 500M. Você pode mover o if($1 > 500000)e imprimirá o maior arquivo do diretório.


1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

ou

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


0

Este script simplifica a localização de arquivos maiores para ações futuras. Eu o mantenho em meu diretório ~ / bin e coloco ~ / bin em meu $ PATH.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

Essa é uma maneira bem mais simples de fazer isso:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

E você vai conseguir: 8445 examples.desktop


O que é 1***suposto fazer no final? Recebo um erro "nenhuma correspondência encontrada" para esse argumento.
user4815162342

0

Solução Linux: Por exemplo, você deseja ver todos os arquivos / lista de pastas do seu diretório inicial (/) de acordo com o tamanho do arquivo / pasta ( ordem decrescente ).

sudo du -xm / | sort -rn | Mais


0

Para listar o arquivo maior em uma pasta

ls -sh /pathFolder | sort -rh | head -n 1

A saída ls -shé uma visão dimensionada se hcompreensível do número do tamanho do arquivo.

Você poderia usar ls -shS /pathFolder | head -n 1. Quanto maior Sa partir lsjá ordenar a lista dos arquivos maiores para os menores, mas o primeiro resultado a soma de todos os arquivos nessa pasta. Então, se você quiser apenas listar o arquivo maior, um arquivo, você precisa head -n 2e verificar no "resultado da segunda linha" ou usar o primeiro exemplo com ls sort head.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.