¿Cuáles son las opciones de tamaño de archivo para el comando "buscar . -tamaño"?

¿Cuáles son las opciones de tamaño de archivo para el comando "buscar . -tamaño"?

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 csufijo. Sin sufijo, los valores se interpretan como bloques de 512 bytes; con un csufijo, los valores se interpretan como recuentos de bytes, según lo haya determinado.

Algunas implementaciones admiten más sufijos; Por ejemploÑUfindapoya

  • bpara bloques de 512 bytes
  • cpor bytes
  • wpara palabras de 2 bytes
  • kpara kibibytes
  • Mpor mebibytes
  • Gpara gibibytes

Respuesta2

POSIXly:

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 shla 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 csufijo, 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 findutilidad.

Ahora, varias findimplementaciones admiten sufijos adicionales, pero tenga cuidado, los mismos sufijos pueden ser interpretados de manera diferente por diferentes implementaciones.

Comoanotado por @StephenKitt,ÑUfindadmite cwbkMGbytes, palabras, unidades de 512 bytes, kibibyte, mebibyte, gibibyte, pero se comporta como findrequiere POSIX en el sentido de que, find . -size -12Gpor 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 -1Gsó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 ocupadafindadmite cwbksufijos 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 -1es 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 finden 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 TPEpara tebibyte, pebibyte y exbibyte también son compatibles y dse puede usar un sufijo adicional (decimal) para especificar que las unidades son potencias de 1000 en lugar de 1024. Por ejemplo, -size 1kdbusca 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 0xffffnúmeros hexadecimales, existe un conflicto porque cbedCBEDtambién son dígitos hexadecimales. -size -0x2cno es para menos de 0x2 bytes, sino para menos de 0x2c (44) unidades de 512 bytes. Y -size 010cse trata como -size 8c(octal), otra no conformidad con POSIX.

FreeBSD/Libélula BSD findadmite ckMGTP(no bwE), pero si bien se comporta según lo requiere POSIX sin sufijo, se comporta como Busybox/toybox y no como GNU findcuando hay un sufijo².

sfindo el findshell bosh integrado se comporta como el de FreeBSD, excepto que los sufijos no distinguen entre mayúsculas y minúsculas y bwEson 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 cpara 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 csufijo, números decimales solo sin ceros a la izquierda y calcular las unidades manualmente.

Para completar, el Lcalificador global de zsh( kmgtsin distinguir entre mayúsculas y minúsculas, pero pPes 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_sizeatributo 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/ sfindpara los -Xtimepredicados donde, por ejemplo, -mtime +1coincidencias en archivos que tienen 2 días de antigüedad o más (edad 86400*2 - ∞) mientras que -mtime +1dcoincidencias en archivos que tienen más de un día (edad 86400.000000001 - ∞ ). Con GNU find, consulte también ! -newermt -1day(o 1 day agoo 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 1kenumerará todos los archivos con tamaño∈[1,1024], mientras que find . -size 1024csolo enumerará los archivos cuyo tamaño real sea exactamente 1024 bytes.

información relacionada