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"?

Nicolas Raoul
la source

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"
Lars Rohrbach
la source
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 source
@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')"
Drew Beres
la source
1
Sur macOS Sierra, l'option -iname est disponible par défaut.
ThomasW