
Descubrí que para buscar el tamaño del archivo en bytes, uso 'c'.
Entonces puedo buscar un tamaño de archivo de 1000 bytes usando: buscar. -tamaño 1000c
Pero ¿qué pasa con los diferentes tipos de tamaño, como Mb, Gb o incluso bits? ¿Qué carácter o letras necesito usar?
Respuesta1
POSIXsolo no especifica ningún sufijo o un c
sufijo. Sin sufijo, los valores se interpretan como bloques de 512 bytes; con un c
sufijo, los valores se interpretan como recuentos de bytes, según lo haya determinado.
Algunas implementaciones admiten más sufijos; Por ejemploÑUfind
apoya
b
para bloques de 512 bytesc
por bytesw
para palabras de 2 bytesk
para kibibytesM
por mebibytesG
para gibibytes
Respuesta2
find . -size 1000c # files whose size¹ is exactly 1000 bytes (not characters)
find . -size -1000c # strictly less than 1000 bytes (0 - 999)
find . -size +1000c # strictly more than 1000 bytes (1001 - ∞)
Luego, usando sh
la sintaxis POSIX, puedes hacer:
EiB=$((1024*(PiB=1024*(TiB=1024*(GiB=1024*(MiB=1024*(KiB=1024)))))))
EB=$((1000*( PB=1000*( TB=1000*( GB=1000*( MB=1000*( kB=1000)))))))
find . -size "$(( 12 * GiB ))c" # exactly 12GiB (12,884,901,888 bytes)
find . -size "$(( 12 * GB ))c" # exactly 12GB (12,000,000,000 bytes)
find . -size "-$(( 12 * GB ))c" # 0 - 11,999,9999,999 bytes
...
Sin el c
sufijo, tenga cuidado, el comportamiento puede resultar sorprendente:
find . -size 1000 # files whose size, in number of 512-byte units (rounded *up*)
# is 1000. So, that's file whose size in bytes ranges from
# 1000*512-511 (999*512+1) to 512*1000
find . -size -1000 # files whose size is 999*512 bytes or less
find . -size +1000 # files whose size is 1000*512+1 bytes or more
Eso es todo por la especificación POSIX de la find
utilidad.
Ahora, varias find
implementaciones admiten sufijos adicionales, pero tenga cuidado, los mismos sufijos pueden ser interpretados de manera diferente por diferentes implementaciones.
Comoanotado por @StephenKitt,ÑUfind
admite cwbkMG
bytes, palabras, unidades de 512 bytes, kibibyte, mebibyte, gibibyte, pero se comporta como find
requiere POSIX en el sentido de que, find . -size -12G
por ejemplo, no es el mismo que el find . -size "-$((12 * GiB))c"
de arriba, ya que se trata de archivos cuyo tamaño en número de gibibytes (redondeado hacia arriba) es estrictamente menos de 12, por lo que archivos de 11 GiB o menos.
Por ejemplo, find . -size -1G
sólo encuentra archivos vacíos (archivos de tamaño 0). Un archivo de un byte se considera de 1 GiB ya que los tamaños se redondean al siguiente GiB.
caja ocupadafind
admite cwbk
sufijos pero los interpreta de manera diferente a GNU find
. Es tambiénactualmente no es compatible con POSIX para el manejo de tamaños sin sufijos.
Para caja ocupada find
,find . -size -12G
eslike find . -size "-$(( 12 * GiB ))c"
y find . -size -1
es para tamaños que van de 0 a 511 en lugar de solo 0.
caja de juguetesfind
(como se encuentra en Android, por ejemplo) se comporta como Busybox find
en ese sentido (y también esno compatible con POSIX). Otra diferencia es que los sufijos no distinguen entre mayúsculas y minúsculas allí y TPE
para tebibyte, pebibyte y exbibyte también son compatibles y d
se puede usar un sufijo adicional (decimal) para especificar que las unidades son potencias de 1000 en lugar de 1024. Por ejemplo, -size 1kd
busca archivos que tengan exactamente 1000 bytes (1 kilobyte) en lugar de 1024 bytes (1 kibibyte) para -size 1k
.
En toybox find
, el manejo del sufijo se realiza como parte de su atolx()
función que no solo se usa para find
. Sin embargo, tenga en cuenta que, dado que admite 0xffff
números hexadecimales, existe un conflicto porque cbedCBED
también son dígitos hexadecimales. -size -0x2c
no es para menos de 0x2 bytes, sino para menos de 0x2c (44) unidades de 512 bytes. Y -size 010c
se trata como -size 8c
(octal), otra no conformidad con POSIX.
FreeBSD/Libélula BSD find
admite ckMGTP
(no bwE
), pero si bien se comporta según lo requiere POSIX sin sufijo, se comporta como Busybox/toybox y no como GNU find
cuando hay un sufijo².
sfind
o el find
shell bosh integrado se comporta como el de FreeBSD, excepto que los sufijos no distinguen entre mayúsculas y minúsculas y bwE
son compatibles con números octales/decimales y algunosexpresiones aritméticas del producto(como 6x12x8k
) son aceptados.
Hasta donde puedo decir, todos losOpenBSD,NetBSD,ilumos,Solaris,AIX,HP/UXsolo admite sin sufijo para unidades de 512 bytes o c
para bytes según se requiera POSIX.
Una tabla resumen:
Tradicional/POSIX | ÑU | FreeBSD | encontrar | caja ocupada | caja de juguetes | |
---|---|---|---|---|---|---|
sufijos | C | cwbkMG | ckMGTP | cwbkmgtpeCWBKMGTPE | cwbk | cwbkmgtpeCWBKMGTPE (+d) |
formato numérico | decimal | decimal | decimal | diciembre/oct/hex/expr | decimal | diciembre/oct/hexadecimal |
-size $n |
($n-1)*512+1 .. $n*512 | ($n-1)*512+1 .. $n*512 | ($n-1)*512+1 .. $n*512 | ($n-1)*512+1 .. $n*512 | $n*512 | $n*512 |
-size -$n |
0 .. ($n-1)*512 | 0 .. ($n-1)*512 | 0 .. ($n-1)*512 | 0 .. ($n-1)*512 | 0 .. $n*512-1 | 0 .. $n*512-1 |
-size +$n |
($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ | ($n*512)+1 .. ∞ |
-size ${n}c |
$n | $n | $n | $n | $n | $n |
-size -${n}c |
0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 | 0 .. $n-1 |
-size +${n}c |
$n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ | $n+1 .. ∞ |
-size $n$unit |
N / A | ($n-1)*$unidad+1 .. $n*$unidad | $n*$unidad | $n*$unidad | $n*$unidad | $n*$unidad |
-size -$n$unit |
N / A | 0 .. ($n-1)*$unidad | 0 .. $n*$unidad-1 | 0 .. $n*$unidad-1 | 0 .. $n*$unidad-1 | 0 .. $n*$unidad-1 |
-size +$n$unit |
N / A | $n*$unidad+1 .. ∞ | $n*$unidad+1 .. ∞ | $n*$unidad+1 .. ∞ | $n*$unidad+1 .. ∞ | $n*$unidad+1 .. ∞ |
Entonces, en resumen, para la portabilidad, lo mejor que puede hacer es usar el c
sufijo, números decimales solo sin ceros a la izquierda y calcular las unidades manualmente.
Para completar, el L
calificador global de zsh
( kmgt
sin distinguir entre mayúsculas y minúsculas, pero pP
es para unidades de 512 bytes, no pebibytes) se comporta como POSIX/GNU find
( *(LM-12)
se expande a archivos cuyo tamaño está entre 0 y 11 mebibytes, por ejemplo).
¹ Ese es el tamaño informado en el st_size
atributo de la estructura devuelta lstat()
cuyo significado para archivos no regulares puede variar entre sistemas.
² Existe el mismo tipo de distinción en FreeBSD find
/ sfind
para los -Xtime
predicados donde, por ejemplo, -mtime +1
coincidencias en archivos que tienen 2 días de antigüedad o más (edad 86400*2 - ∞) mientras que -mtime +1d
coincidencias en archivos que tienen más de un día (edad 86400.000000001 - ∞ ). Con GNU find
, consulte también ! -newermt -1day
(o 1 day ago
o yesterday
).
Respuesta3
Para agregar a lo que mencionó Stephen Kitt, tenga cuidado con ese hallazgo gnuredondea¡El tamaño a la granularidad especificada antes de comparar!
Si lo haces
truncate --size=1000 dummy_file_1000
truncate --size=1024 dummy_file_1024
entonces
find . -size 1k
find . -size 1024c
voluntadnoda el mismo resultado!
Vercomando de búsqueda: -comportamiento de tamaño
En resumen, find . -size 1k
enumerará todos los archivos con tamaño∈[1,1024], mientras que find . -size 1024c
solo enumerará los archivos cuyo tamaño real sea exactamente 1024 bytes.