Jeg leder efter filen “WSFY321.c” i et stort kataloghierarki.
Normalt bruger jeg GNU find : find . -name "WSFY321.c"
Men jeg kender ikke sagen, det kan være store, små bogstaver eller en blanding af begge.
Hvad er den nemmeste måde at finde denne fil på?
Er der noget bedre end find . | grep -i "WSFY321.c"
?
Svar
Nylige versioner af GNU find
har et -iname
-flag til store og små bogstaver i navnet.
find . -iname "WSFY321.c"
Kommentarer
Svar
Med GNU find eller andre versioner af find, der har det:
find . -iname "WSFY321.c"
Med andre versioner:
find . -name "[Ww][Ss][Ff][Yy]321.[Cc]"
Eller et kompromis, der er langsommere, men lettere at skrive:
find . -name "????321.c" | grep -i "/WSFY[^/]*$"
Eller i zsh:
print -rl -- **/(#i)WSFY321.c
Kommentarer
- @Gilles
grep
versionen filtrerer kun store bogstaver, og jeg don ' t forstå ' [^ /] ' .. (ikke /) - @Gilles Hvad er argumentet for bruge de enkelte citater i det første tilfælde (nøjagtigt filnavn) overhovedet ikke citater?
- @ Peter.O Nej
*
efter/
i bash-versionen. Jeg mentegrep -i
. Jeg u se[^/]*
i stedet for.*
for ikke at fange filer i mapper, hvis navn begynder medWSFY
. - @Bernhard Konsistens.
- Tak Gilles: Jeg slettede den forrige kommentar med forkert syntaks og testede den ændrede version, men den ' t arbejde uden * (af en uventet grund; i det mindste for mig). Den store og små bogstaver virker ikke længere:
shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c
… Jeg antager, at ' derfor kaldes en nocase glob : det fungerer kun i sammenhæng med en glob (eller sådan ser det ud til).
Svar
To løsninger til macOS:
Brug af GNU find
:
brew install findutils --with-default-names # restart Terminal find . -iname "WSFY321.c"
Brug af GNU sed
:
brew install gnu-sed --default-names # restart Terminal find -name "$(sed "s|\([[:alpha:]]\)|[\U\1\L\1]|g" <<<"WSFY321.c")"
Kommentarer
- På macOS Sierra er indstillingen -iname tilgængelig som standard.
-type f
-flagget, så det vandt ' gider ikke at se på navnet, hvis inoden er et bibliotek. Men at ' s pedantiske optimeringsniveauer …find . -iname \*WSFY321.c\* -type f