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).