Como posso encontrar arquivos grandes de suporte?

1

Eu gostaria de encontrar todos os arquivos do meu sistema, cujos tamanhos são mais do que alguns gigabits. Eu pensei que usaria find -size , mas a página man afirma:

The size does not count indirect blocks

Se eu entendi isso corretamente, a pesquisa só é relevante quando o tamanho está abaixo %código%. Então, como posso listar arquivos maiores que isso?

EDIT : Eu devo estar errado em algum lugar, pois a página man suporta Gigabits como uma unidade de tamanho. Alguém pode ver onde eu estaria errado? Alterou o título para refletir isso.

    
por qdii 03.06.2013 / 23:50

2 respostas

1

Eu acho que este link pode esclarecer as coisas, Especificações do Grupo Open Base Edição 7, IEEE Std 1003.1, Edição 2013 . Aqui está um trecho da seção da especificação para encontrar:

excerto da especificação de pesquisa

The -size operand refers to the size of a file, rather than the number of blocks it may occupy in the file system. The intent is that the st_size field defined in the System Interfaces volume of POSIX.1-2008 should be used, not the st_blocks found in historical implementations. There are at least two reasons for this:

In both System V and BSD, find only uses st_size in size calculations for the operands specified by this volume of POSIX.1-2008. (BSD uses st_blocks only when processing the -ls primary.)

Users usually think of file size in terms of bytes, which is also the unit used by the ls utility for the output from the -l option. (In both System V and BSD, ls uses st_size for the -l option size field and uses st_blocks for the ls -s calculations. This volume of POSIX.1-2008 does not specify ls -s.)

Se eu entendi esta seção corretamente, a primeira seção diz tudo "O operando -size refere-se ao tamanho de um arquivo". Então o tamanho é o que é reportado ao avaliar st_size NOT st_blocks.

Exemplos

Então você deve poder usar comandos como:

# find files over 1G in size
$ find / -type f -size +1G

# find files smaller than 1G in size
$ find / -type f -not -size +1G

Referências

por 04.06.2013 / 01:07
1

Essa frase é extremamente enganosa. Se você não quiser entrar em detalhes, esqueça que leu e apenas assuma que -size analisa o tamanho do arquivo.

O tamanho de um arquivo é o número de bytes que você pode ler a partir dele. Um arquivo de tamanho N é uma matriz de N bytes.

Quando você passa uma unidade diferente de bytes ( c ) para -size , o comando find arredonda o tamanho do arquivo até um múltiplo da unidade. Por exemplo, -size 11k corresponde a arquivos de 10.240 a 11.263 bytes; -size 12345M maches arquivos de 12.943.622.145 a 12.944.670.720 bytes. A unidade padrão, por razões históricas, é chamada de blocos e seu valor é de 512 bytes.

Essa foi a parte fácil. Agora, em sistemas de arquivos típicos, os dados de um arquivo são armazenados em blocos. Para um sistema de arquivos cujo tamanho de bloco é de 512 bytes¹, um arquivo de 5123 bytes ocuparia 11 blocos de dados (o último sendo usado apenas parcialmente). Portanto, find -size 11 normalmente corresponde a arquivos que consistem em 11 blocos.

Na verdade, existem possíveis complicações. O sistema operacional precisa ter um local onde armazenar a localização de todos os blocos que compõem o arquivo. Se houver muitos blocos, ele precisará alocar mais alguns blocos para conter os endereços de outros blocos. Esses blocos são chamados de blocos indiretos. O manual find informa que esses blocos não são levados em conta - o que não é de surpreender, pois find não está contando blocos, está olhando para o tamanho do arquivo.

Por outro lado, é possível ter um arquivo que use menos blocos do que o esperado, devido à compactação. Os sistemas de arquivos unix clássicos implementam apenas uma forma bruta de compactação: blocos que consistem exclusivamente de bytes nulos podem ser omitidos. Isso é conhecido como arquivos esparsos.

Um programa pode saber quantos blocos foram alocados para um arquivo; este é o campo st_blocks da stat structure , em oposição a st_size . O GNU find só usa isso em seu código de exibição para -ls e -printf , nunca para qualquer predicado. O valor st_blocks fornece uma indicação grosseira de quanto espaço o arquivo ocupa no disco, que pode ser menor que o tamanho do arquivo, se o arquivo for esparso, mas não leva em consideração blocos indiretos.

¹ Ext2, ext3 e ext4 possuem blocos de 1kB, 2kB ou 4kB.

    
por 04.06.2013 / 03:11