Como encontrar o maior tamanho de arquivo em um diretório grande

0

Eu tenho um diretório grande, com muitos arquivos por apenas ls . Minha ideia: use algo ao longo da linha de:

find . -name * -exec wc -c < {} \; | sort | tail -n 1

Problema: o shell está interpretando como ( find . -name * -exec wc -c ) < ( {} \; ) | ...

Eu preciso do "<" no < {} , para evitar a exibição do nome do arquivo em sort .

Eu também tentei

find . -name "*" -exec cat {} +| wc -c

No entanto, isso parece ser interpretado como: ( find . -name "*" -exec cat {} ) | ( wc -c ) - isso me dá o tamanho de todos os arquivos combinados.

Há também uma variante usando du - no entanto, como Os maiores arquivos podem ter apenas alguns bytes de distância, isso é exibido ao longo das linhas de um milhão de arquivos com tamanho de 500 KB - novamente, muitos para ls.

    
por Alex 18.07.2017 / 16:01

2 respostas

2

Para imprimir o maior arquivo (com tamanho em kilobytes), a abordagem ls :

ls -S1s --block-size=K | sed -n '2{p;q;}'
  • -S - classifique por tamanho de arquivo, maior primeiro

  • -s - imprime o tamanho alocado de cada arquivo, em blocos

  • -1 - liste um arquivo por linha

  • sed -n '2{p;q;}' - a primeira linha em ls output é a linha com total size (por exemplo, total 388K ). A segunda linha é a linha que contém o maior arquivo com seu tamanho. Esta expressão considerará apenas a segunda linha necessária

por 18.07.2017 / 16:17
2

Supondo que nenhum dos seus nomes de arquivo contenha uma nova linha ( \n ), e que você tenha utilitários GNU, você pode usar isso como uma solução rápida e suja:

find . -maxdepth 1 -type f -exec stat --fmt $'%s\t%n' {} + | sort -n | tail -1

Remova -maxdepth 1 se você tiver subdiretórios que devem ser incluídos na pesquisa. Se o seu find não suportar o terminador + , você poderá substituí-lo pelo menos eficiente \; . Altere a string de formato para apenas '%s' se você não quiser a saída do nome do arquivo.

Se você tiver nomes de arquivo com caracteres não imprimíveis, poderá usar essa variante mais lenta:

find . -maxdepth 1 -type f -exec stat --printf "%s\t" {} \; -print | sort -n | tail -1

Remova -print se você realmente não quiser a saída do nome do arquivo.

Para o OSX, acho que você pode usar um comando como esse, mas não tenho como testá-lo. Remova -print se você não quiser a saída do nome do arquivo:

find . -maxdepth 1 -type f -exec stat -f '%z' -n {} \; -print | sort -n | tail -n 1
    
por 18.07.2017 / 16:06

Tags