linux find: procurar por arquivos menores que 2Kb perde aqueles entre 1 e 2Kb

3

Eu apenas tropecei em uma esquisitice com o comando find no Linux, em poucas palavras eu tive a necessidade de encontrar todos os arquivos menores que 2Kb em uma certa pasta, então eu emiti o comando:

find /folder_to_search_into/ -type f -size -2k

que de acordo com a página man do find deve retornar tudo menor que 2Kilobytes

Mas o que eu notei é que ele perdeu vários arquivos, que tinham entre 1 e 2Kb de tamanho.

Em seguida, publiquei

find /folder_to_search_into/ -type f -size -2048c

que deve ser o equivalente exato, já que "c" significa bytes e, neste caso, encontrou todos os arquivos que eu estava procurando.

Alguma idéia de por que esse comportamento? Eu provavelmente estou sentindo falta do óbvio aqui. Não tenho certeza se está relacionado a essa observação (na página do manual do encontro - na seção de tamanho):

The size does not count indirect blocks, but it does count blocks in sparse files that are not actually allocated. Bear in mind that the '%k' and '%b' format specifiers of -printf handle sparse files differently. The 'b' suffix always denotes 512-byte blocks and never 1 Kilobyte blocks, which is different to the behavior of -ls.

    
por adriano72 03.10.2013 / 09:18

1 resposta

3

2k não é equivalente a 2048c .

Para demonstração, criei arquivos nomeados correspondentes ao seu tamanho em bytes:

$ ls -l
total 36
-rw-r--r-- 1 lesmana lesmana 1000 2013-10-03 15:29 s1000
-rw-r--r-- 1 lesmana lesmana 1023 2013-10-03 15:32 s1023
-rw-r--r-- 1 lesmana lesmana 1024 2013-10-03 15:32 s1024
-rw-r--r-- 1 lesmana lesmana 1025 2013-10-03 15:32 s1025
-rw-r--r-- 1 lesmana lesmana 2000 2013-10-03 15:29 s2000
-rw-r--r-- 1 lesmana lesmana 2047 2013-10-03 15:37 s2047
-rw-r--r-- 1 lesmana lesmana 2048 2013-10-03 15:37 s2048
-rw-r--r-- 1 lesmana lesmana 2049 2013-10-03 15:37 s2049
-rw-r--r-- 1 lesmana lesmana 3000 2013-10-03 15:29 s3000

Aqui está o comando dd que usei para criar os arquivos:

dd if=/dev/zero of=filename bs=1 count=filesizeinbytes

Observe:

$ find -size 2048c
./s2048
$ find -size 2k
./s2000
./s1025
./s2047
./s2048

e:

$ find -size 1024c
./s1024
$ find -size 1k
./s1023
./s1000
./s1024

A lógica de -size 2048c significa que todos os arquivos com tamanho em bytes são 2048. A lógica de -size 2k significa que todos os arquivos com tamanho arredondado para o próximo kilobyte são 2

Observe ainda mais:

$ find -size -2k
./s1023
./s1000
./s1024
$ find -size -2048c
./s2000
./s1023
./s1025
./s2047
./s1000
./s1024

A lógica de -size -2048c é qualquer arquivo cujo tamanho em bytes seja menor que 2048. A lógica de -size -2k é qualquer arquivo cujo tamanho arredondado para o próximo kilobyte é menor que 2.

    
por 03.10.2013 / 15:54