Caut fișierul „WSFY321.c” într-o imensă ierarhie de directoare.
De obicei aș folosi GNU find : find . -name "WSFY321.c"
Dar nu știu cazul, ar putea fi majuscule, minuscule sau o combinație a ambelor.

Care este cel mai simplu mod de a găsi acest fișier?
Există ceva mai bun decât find . | grep -i "WSFY321.c"?

Răspuns

Versiunile recente ale GNU find au un semnalizator -iname, pentru căutări de nume care nu disting majuscule / minuscule.

find . -iname "WSFY321.c" 

Comentarii

  • De asemenea, din moment ce tu ' căutați în mod specific un fișier, probabil puteți rade încă câteva căpușe pe cel cu steagul -type f, astfel încât a câștigat ' nu te deranjează să te uiți la numele dacă inodul este un director. Dar acel ' nivel pedant de optimizare …
  • Pentru a lucra cu unele regex puteți face find . -iname \*WSFY321.c\* -type f

Răspuns

Cu GNU find sau alte versiuni de find care îl au:

find . -iname "WSFY321.c" 

Cu alte versiuni:

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

Sau un compromis care este mai lent, dar mai ușor de tastat:

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

Sau în zsh:

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

Comentarii

  • @Gilles Versiunea grep filtrează numai majuscule și nu ' t înțelegeți ' [^ /] ' .. (nu /)
  • @Gilles Care este argumentul folosiți ghilimelele unice în primul caz (numele fișierului exact) fără niciun ghilimel?
  • @ Peter.O Nu * după / în versiunea bash. Am vrut să spun grep -i. I u se [^/]* mai degrabă decât .* pentru a nu prinde fișiere în directoare al căror nume începe cu WSFY.
  • @Bernhard Consistency.
  • Mulțumesc Gilles: Am șters comentariul anterior cu o sintaxă incorectă și am testat versiunea modificată, dar nu ' t funcționează fără * (dintr-un motiv neașteptat; pentru mine cel puțin). Opțiunea insensibilă la majuscule și minuscule nu mai funcționează: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Presupun că ' este motivul pentru care se numește nocase‍ glob : funcționează numai în contextul unui glob (sau așa se pare).

Răspuns

Două soluții pentru macOS:

Utilizarea GNU find:

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

Utilizarea GNU sed:

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

Comentarii

  • Pe macOS Sierra, opțiunea -iname este disponibilă în mod implicit.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *