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
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ă spungrep -i
. I u se[^/]*
mai degrabă decât.*
pentru a nu prinde fișiere în directoare al căror nume începe cuWSFY
. - @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.
-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 …find . -iname \*WSFY321.c\* -type f