# [find] besoin d'aide pour cde de recherche complexe (résolu)

## gglaboussole

Bonsoir,

Malgré la lecture des pages man de "find" je n'arrive pas à lui faire afficher ce que je veux...

J'ai un repertoire /home/jerome/Music assez conséquent et j'aimerai pouvoir faire afficher la liste des fichiers qui ne sont ni des .mp3, ni des .ogg, ni des .flac et qui y sont présent...

Si toutefois il existe un autre utilitaire de recherche plus intuitif je suis preneur   :Wink: 

Merci de votre aide

----------

## Bapt

en zsh si tu active l'option extendedglob rien de plus simple : 

```

print -l /home/jerome/Music/**/*~*.(mp3|ogg|flac)(.)

```

j'utilise print -l au lieu de ls car le nombre d'arguments risque d'être trop important pour la commande ls

----------

## gglaboussole

Merci de ta réponse Bapt mais malheureusement j'utilise bash   :Sad:  ...

je trouve plein de truc sur google pour trouver des fichiers "qui sont" mais rien "qui sont pas...." ( euh je suis clair là   :Laughing:  ) alors j'essaie avec le privatif "!" mais marche poa..

----------

## geekounet

 *gglaboussole wrote:*   

> Merci de ta réponse Bapt mais malheureusement j'utilise bash   ...

 

SI ça te deprimes tant, pourquoi ne pas changer ?  :Very Happy:  Enfin ça te changerai la vie pour ce genre de choses en tout cas.

Sinon avec find tu peux faire ça :

```
% find /home/jerome/Music -not -iname "*.mp3" -not -iname "*.ogg" -not -iname "*.flac"
```

Mais c'est plus chiant et plus lent.  :Smile: 

----------

## truc

 *geekounet wrote:*   

> Mais c'est plus chiant et plus lent. 

 

plus lent à taper? ou alors tu as des chiffres pour appuyer tes propos?

----------

## gglaboussole

Aie... aurais je malgré moi induit un soupçon de troll ?

en tout cas merci geekounet pour ta soluce c'est exactement ce que je cherchais, et j'ai honte tellement c'est tout con en fait...me suis battu avec des "!" des "*" et des "()" mais le "not" l'avais pas intégré !

En revanche je plussoie truc c'est très rapide (mais forcémént j'peux pas comparer avec zsh   :Laughing:  )

merci encore

----------

## geekounet

 *truc wrote:*   

>  *geekounet wrote:*   Mais c'est plus chiant et plus lent.  
> 
> plus lent à taper? ou alors tu as des chiffres pour appuyer tes propos?

 

Bah d'un coté t'as un shell qui va utiliser seulement ses fonctions internes (rien à charger donc) et qui va faire la recherche en ne testant qu'une seule regexp pour chaque fichier, et de l'autre t'appelle un soft externe (temps de chargement tout ça...) qui va faire la recherche en appliquant 3 tests par fichier, donc logiquement...  :Smile: 

Et puis plus lent à taper oui, et moins beau.  :Razz: 

----------

## truc

 *geekounet wrote:*   

> ...

 

Pour moi ça n'est pas suffisant pour tirer des conclusions, car le truc externe à chargé en question est justement codé *exactement* pour cette utilisation, et pas pour autre chose.

De plus, l'expression simplifiée que tu as pour zsh, n'est pas magique non plus, faudra bien qu'il y ait des tests en tout genre, comme pour les '3 tests' par fichier dont tu parles.

Et en plus, avec le find que tu as donné, pas de regex. Or on sait que pour un même test, si on peut le faire sans regex, c'est plus efficace. Maintenant, pour 3 tests, effectivement je n'en sais rien.. Mais pour moi, c'est loin d'être évident!

(Mais rien ne nous aurait empecher de le faire avec une regex également, avec style :

```
find bla/ -type f -not -iregex '.*\.(mp3|ogg|flac)'
```

-pas testé-

)

L'OP va peut-être bien vouloir installer zsh, et faire toute une batterie de test pour nous?  :Wink: 

J'plaisante  :Wink: 

Bonne journée

[ EDIT ] Après pour des raisons similaires à celles qui t'ont pousser utiliser 'print -l' au lieu de 'ls', et selon ce qu'il est souhaité de faire par la suite, il est bon par la suite de faire un -print0 et de 'piper' le tout dans un 'xargs -0', c'est plus rapide, si beaucoup de fichier que de faire un -exec (cf manuel)

----------

## geekounet

Bon si tu veux des chiffres :

```
[pierre@Korriban ~] % time ls -l ~/Music/**/*~*.(mp3|ogg|flac)(.)

ls --color=auto -l ~/Music/**/*~*.(mp3|ogg|flac)(.)  0.06s user 0.14s system 97% cpu 0.209 total

[pierre@Korriban ~] % time find ~/Music/ -not -iname "*.mp3" -not -iname "*.ogg" -not -iname "*.flac"

find ~/Music/ -not -iname "*.mp3" -not -iname "*.ogg" -not -iname "*.flac"  0.06s user 0.03s system 20% cpu 0.451 total
```

ls plutôt que print sinon il me fait pas le time, donc du coup ça handicape même la méthode zsh. Et j'ai lancé les 2 plusieurs fois, en prenant le meilleur temps de chaque.  :Razz: 

----------

## truc

ok, ça commence à devenir interessant :p

T'as vidé le cache de tes disques entres chaque essai? (un echo 3 > /proc/sys/machin.. si je n'mabuse)

Quelle est la taille de ce repertoire histoire d'avoir un repère?

J'nai pas de particulièrement gros repertoire au boulot, donc je ne peux pas vraiment contribuer (fin, je monte bien un gros partage samba, mais bon c'est pas idéal...)

Tu pourrais essayer avec la regex pour find aussi, histoire de voir?

Mais effectivement, les résultats sont un peu faussé si tu ne peux pas le faire qu'en zsh, avec le print -l. Peut-être devrait-on punir le find, en lui collant un -exec ls -l '{}' +, ou plus juste peut-être un -print0 | xargs -0 ls -l  :Question: 

 :Smile: 

EDIT: Bon, et donc, pour les résultats qu'on a pour l'instant, c'est bien le 0.06 le temps qu'il faut regarder ou le dernier?

----------

