Descobri que para procurar o tamanho do arquivo em bytes, uso 'c'.
Assim, posso procurar o tamanho do arquivo com 1000 bytes usando: find . -tamanho 1000c
Mas e quanto a diferentes tipos de tamanho, como Mb, Gb ou até bits? Que caracteres ou letras preciso usar?
POSIX especifica apenas nenhum sufixo ou um
c
sufixo. Sem sufixo, os valores são interpretados como blocos de 512 bytes; com umc
sufixo, os valores são interpretados como contagens de bytes, conforme você determinou.Algumas implementações suportam mais sufixos; por exemplo, GNU
find
suportab
para blocos de 512 bytesc
para bytesw
para palavras de 2 bytesk
para kibibytesM
para mebibytesG
para gibibytesPara complementar o que Stephen Kitt mencionou, tome cuidado para que gnu find arredonda o tamanho para a granularidade especificada antes de comparar!
Se você fizer
então
não dará o mesmo resultado!
Veja o comando find: comportamento -size
Resumindo -
find . -size 1k
listará todos os arquivos com tamanho∈[1,1024], enquantofind . -size 1024c
listará apenas os arquivos cujo tamanho real é exatamente 1024 bytes.POSIXamente :
Então, usando
sh
a sintaxe POSIX, você pode fazer:Sem o
c
sufixo, cuidado, o comportamento pode ser surpreendente:É isso para a especificação POSIX do
find
utilitário.Agora, várias
find
implementações suportam sufixos adicionais, mas cuidado, pois os mesmos sufixos podem ser interpretados de maneira diferente por implementações diferentes.Conforme observado por @StephenKitt , o GNU
find
suportacwbkMG
byte, word, unidade de 512 bytes, kibibyte, mebibyte, gibibyte, mas se comporta como o POSIXfind
exige, pois,find . -size -12G
por exemplo, não é o mesmo que ofind . -size "-$((12 * GiB))c"
anterior, pois são arquivos cujo tamanho em número de gibibyte (arredondado para cima) é estritamente menor que 12, portanto, arquivos com 11GiB ou menos.Por exemplo,
find . -size -1G
encontra apenas arquivos vazios (arquivos de tamanho 0). Um arquivo de um byte é considerado 1GiB, pois os tamanhos são arredondados para o próximo GiB.busybox
find
suportacwbk
sufixos, mas os interpreta de maneira diferente do GNUfind
. Também não é compatível com POSIX para lidar com tamanhos sem sufixos.Para busybox
find
,find . -size -12G
é semelhante afind . -size "-$(( 12 * GiB ))c"
, efind . -size -1
serve para tamanhos que variam de 0 a 511 em vez de apenas 0.toybox
find
(como encontrado no Android, por exemplo) se comporta como busyboxfind
nesse aspecto (e também não é compatível com POSIX). Outra diferença é que os sufixos não diferenciam maiúsculas de minúsculas eTPE
para tebibyte, pebibyte e exbibyte também são suportados e umd
sufixo adicional (decimal) pode ser usado para especificar que as unidades são potências de 1000 em vez de 1024. Por exemplo,-size 1kd
encontra arquivos que são exatamente 1000 bytes (1 kilobyte) em vez de 1024 bytes (1 kibibyte) para arquivos-size 1k
.No toybox
find
, o manuseio do sufixo é feito como parte de suaatolx()
função que não é usada apenas parafind
. Observe, entretanto, que como isso suporta0xffff
números hexadecimais, há um conflito, poiscbeCBE
também são dígitos hexadecimais.-size -0x2c
não é para menos de 0x2 bytes, mas para menos de 0x2c (44) unidades de 512 bytes.find
Suporte FreeBSD/DragonFlyBSDckMGTP
(nãobwE
), mas embora se comporte conforme exigido pelo POSIX sem sufixo, ele se comporta como busybox/toybox e não como GNUfind
quando há um sufixo.sfind
ou ofind
built-in do shell bosh se comporta como o do FreeBSD, exceto que os sufixos não diferenciam maiúsculas de minúsculas ebwE
são suportados.Até onde eu sei, todos os OpenBSD , NetBSD( https://man.freebsd.org/cgi/man.cgi?query=find&apropos=0&sektion=1&manpath=NetBSD+10.0&arch=default&format=html#PRIMARIES ), Illumos , Solaris , AIX , HP/UX suportam apenas sem sufixo para unidades de 512 bytes ou
c
para bytes conforme POSIX necessário.Então, resumindo, para portabilidade, sua melhor aposta é usar o
c
sufixo e calcular as unidades manualmente.Para completar, o
L
qualificador glob dezsh
(kmgt
sem distinção entre maiúsculas e minúsculas, maspP
é para unidade de 512 bytes, não pebibyte) se comporta como POSIX/GNUfind
(*(LM-12)
expande para arquivos cujo tamanho está entre 0 e 11 mebibytes, por exemplo).¹ É o tamanho informado no
st_size
atributo da estrutura retornadalstat()
cujo significado para arquivos não regulares pode variar entre sistemas.