Find ne parvient pas à trouver des fichiers en dessous de 1M mais fonctionne bien avec les unités ‘k’

J’ai créé le fichier nommé 1.txt et sa taille est de 9kb:

stat 1.txt File: `1.txt' Size: 9322 Blocks: 24 IO Block: 4096 regular file Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-06-26 10:12:47.000000000 +0100 Modify: 2015-06-26 10:12:47.000000000 +0100 Change: 2015-06-26 10:12:47.000000000 +0100 

Lorsque je lance la commande find avec l’option -size -100k avec k units, le fichier est trouvé:

 #find . -type f -size -100k #./1.txt 

Lorsque j’utilise les unités M et -size -10M fichier -size -10M est toujours trouvé:

 #find . -type f -size -10M #./1.txt 

Mais quand j’essaie de trouver des fichiers de moins de 1M, soudain, je ne find pas ce fichier:

 #find . -type f -size -1M # 

Et oui, ma version de find ( find (GNU findutils) 4.4.0 ) supporte l’unité M

Je crois que cela est dû au fait que les unités sont représentées par des entiers et que «moins de 1» est égal à 0, ce qui signifie qu’il recherche des fichiers jusqu’à 0 Mo de taille.

Contre-intuitif à coup sûr, mais probablement conservé pour assurer la compatibilité avec le passé.

La taille est arrondie à un nombre entier d’unités d’espace. Dans votre exemple,

 find . -type f -size -10M 

signifie, des fichiers de taille <= 9M,

et

 find . -type f -size -1M 

signifie des fichiers de taille <= 1M, ce qui signifie en fait 0M car les unités fractionnaires (par exemple 0.5M) ne sont pas prises en charge.

Ce qui suit est extrait du manuel de recherche de gnu:

 -size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b' for 512-byte blocks (this is the default if no suffix is used) `c' for bytes `w' for two-byte words `k' for Kilobytes (units of 1024 bytes) `M' for Megabytes (units of 1048576 bytes) `G' for Gigabytes (units of 1073741824 bytes) The size does not count indirect blocks, but it does count blocks in sparse files that are not actually allocated. Bear in mind that the `%k' and `%b' format specifiers of -printf handle sparse files differently. The `b' suffix always denotes 512-byte blocks and never 1 Kilobyte blocks, which is different to the behaviour of -ls. The + and - prefixes signify greater than and less than, as usual. Bear in mind that the size is rounded up to the next unit. Therefore -size -1M is not equivalent to -size -1048576c. The former only matches empty files, the latter matches files from 1 to 1,048,575 bytes.