Je recherche le fichier « WSFY321.c » dans une énorme hiérarchie de répertoires.
Jutiliserais généralement GNU find : find . -name "WSFY321.c"
Mais je ne connais pas le cas, cela pourrait être en majuscules, en minuscules ou un mélange des deux.

Quelle est la manière la plus simple de trouver ce fichier?
Y a-t-il quelque chose de mieux que find . | grep -i "WSFY321.c"?

Réponse

Les versions récentes de GNU find ont un indicateur -iname, pour les recherches de noms insensibles à la casse.

find . -iname "WSFY321.c" 

Commentaires

  • Aussi, puisque vous ' vous recherchez spécifiquement un fichier que vous pouvez probablement raser un autre couple de graduations avec lindicateur -type f pour quil gagne ' pas la peine de regarder le nom si linœud est un répertoire. Mais ces ' niveaux doptimisation pédantes …
  • Pour travailler avec certaines expressions régulières, vous pouvez faire find . -iname \*WSFY321.c\* -type f

Réponse

Avec GNU find, ou dautres versions de find qui lont:

find . -iname "WSFY321.c" 

Avec les autres versions:

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

Ou un compromis plus lent mais plus facile à saisir:

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

Ou en zsh:

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

Commentaires

  • @Gilles La version grep ne filtre que les majuscules, et je ne ' t comprendre le ' [^ /] ' .. (pas /)
  • @Gilles Quel est largument de utiliser les guillemets simples dans le premier cas (nom de fichier exact) sans guillemets du tout?
  • @ Peter.O Non * après / dans la version bash. Je voulais dire grep -i. Je u se [^/]* plutôt que .* pour ne pas attraper les fichiers dans les répertoires dont le nom commence par WSFY.
  • @Bernhard Consistency.
  • Merci Gilles: Jai supprimé le commentaire précédent avec une syntaxe incorrecte, et testé la version modifiée, mais cela ne ' t fonctionne sans le * (pour une raison inattendue; au moins pour moi). Loption insensible à la casse ne fonctionne plus: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Je suppose que ' s pourquoi on lappelle nocase‍ glob : cela ne fonctionne que dans le contexte dun glob (du moins il semble).

Réponse

Deux solutions pour macOS:

Utilisation de GNU find:

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

Utilisation de GNU sed:

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

Commentaires

  • Sous macOS Sierra, loption -iname est disponible par défaut.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *