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

  • Også da du ' leder specifikt efter en fil, du kan sandsynligvis barbere endnu et par flåter af det med -type f -flagget, så det vandt ' gider ikke at se på navnet, hvis inoden er et bibliotek. Men at ' s pedantiske optimeringsniveauer …
  • For at arbejde med noget regex kan du gøre find . -iname \*WSFY321.c\* -type f

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 mente grep -i. Jeg u se [^/]* i stedet for .* for ikke at fange filer i mapper, hvis navn begynder med WSFY.
  • @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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *