Commande de recherche: comment ignorer la casse?


171

Je cherche le fichier "WSFY321.c" dans une énorme hiérarchie de répertoires.
J'utilise habituellement GNU find : find . -name "WSFY321.c"
Mais je ne connais pas le cas, cela pourrait être en majuscule, minuscule ou un mélange des deux.

Quel est le moyen le plus simple de trouver ce fichier?
Y a-t-il quelque chose de mieux que find . | grep -i "WSFY321.c"?

Réponses:


216

Les versions récentes de GNU findont un -inamedrapeau pour les recherches de noms non sensibles à la casse.

find . -iname "WSFY321.c"

6
De plus, étant donné que vous recherchez spécifiquement un fichier, vous pouvez probablement en éliminer deux autres avec l' -type findicateur afin que le nom ne soit pas pris en compte si l'inode est un répertoire. Mais ce sont des niveaux d'optimisation pédants ...
Shadur

Vous pouvez travailler avec certaines expressions rationnellesfind . -iname \*WSFY321.c\* -type f
Benj

40

Avec GNU find ou d’autres versions de find qui l’ont:

find . -iname 'WSFY321.c'

Avec d'autres versions:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

Ou un compromis plus lent mais plus facile à taper:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

Ou en zsh:

print -rl -- **/(#i)WSFY321.c

@Gilles La grepversion ne filtre que les majuscules et je ne comprends pas le '[^ /]' .. (not /)
Peter.O

@Gilles Quel est l'argument pour utiliser les guillemets simples dans le premier cas (nom du fichier exact) plutôt que sur les guillemets?
Bernhard

@ Peter.O Non *après la /version bash. Je voulais dire grep -i. J'utilise [^/]*plutôt que .*pour ne pas attraper les fichiers dans des répertoires dont le nom commence par WSFY.
Gilles

5
@ Bernhard Cohérence.
Gilles

Merci Gilles: J'ai supprimé le commentaire précédent avec une syntaxe incorrecte et testé la version modifiée, mais cela ne fonctionne pas sans le * (pour une raison inattendue, du moins pour moi). L'option insensible à la casse ne fonctionne plus: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Je suppose que ce pourquoi il est appelé nocase glob : il ne fonctionne que dans le cadre d'un glob (ou paraît - il).
Peter.O

1

Deux solutions pour macOS:

Utiliser GNU find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

Utiliser GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

1
Sur macOS Sierra, l'option -iname est disponible par défaut.
ThomasW
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.