Pourquoi "find -size -1G" ne trouve-t-il aucun file?

Quand j'émets:

find / \( -type f -size +10M \) -and \( -type f -size -1G \) 

Je ne reçois aucun résultat; cependant, quand je tape:

 find / \( -type f -size +10M \) -and \( -type f -size -1000M \) 

il renvoie quelques files.

Qu'est-ce qui ne va pas? Puis-je utiliser une unité de mesure différente des deux côtés de l'opérateur?

Le problème n'est pas lié à l'opérateur -and , mais à la syntaxe inintuitive de l'argument de -size . L'argument n'est pas une taille maximale donnée avec une unité, mais un nombre maximum et une unité dans laquelle le calcul est effectué. Le test- -size -1k ne signifie pas "less de 1kB" mais "le nombre de kB (arrondi) est inférieur à (et non égal à) 1". Ainsi, -size -1k ne correspond qu'aux files de taille 0, de même pour -size -1M , -size -1G , etc.

Pour faire correspondre les files de 2³⁰ octets ou less, utilisez -size -2G ou -size 1025M , etc. (observez comment -2G n'est pas équivalent à -2048M ). Sinon, utilisez ! -size +1G – taille ! -size +1G – une taille avec le modificateur signifie "ssortingctement plus que cette taille". Pour faire correspondre les files de 2³⁰-1 octets ou less, utilisez -size -1073741824c .

Je pense que la raison pour laquelle -size - NUMBER UNIT est si étrange est la compatibilité historique avec -size - NUMBER , qui a compté les blocs; l'arrondissement est logique car un file occupant par exemple 7.5 blocs occupe effectivement 8 blocs dont le dernier bloc n'est pas rempli. Par conséquent, -size -8 signifie «occupant 7 blocs ou less». L'ajout d'une unité fonctionne comme s'il faisait de cette unité la taille du bloc, donc la taille -size -8k signifie «occupant 7kB ou less».

(Cette réponse concerne GNU find – d'autres implémentations se comportent différemment et POSIX ne standardise pas les unités autres que les blocs et les octets).