Jeg leter etter filen «WSFY321.c» i et stort kataloghierarki.
Vanligvis bruker jeg GNU finne : find . -name "WSFY321.c"
Men jeg vet ikke saken, det kan være store, små bokstaver eller en blanding av begge deler.

Hva er den enkleste måten å finne denne filen?
Er det noe bedre enn find . | grep -i "WSFY321.c"?

Svar

Nylige versjoner av GNU find har et -iname -flagg for store og små bokstaver.

find . -iname "WSFY321.c" 

Kommentarer

  • Også siden du ' leter spesifikt etter en fil du sannsynligvis kan barbere et par merker av den med -type f flagget slik at den vant ' bry deg ikke om å se på navnet hvis inoden er en katalog. Men det ' s pedantiske nivåer av optimalisering …
  • For å jobbe med noe regex kan du gjøre find . -iname \*WSFY321.c\* -type f

Svar

Med GNU find, eller andre versjoner av funn som har det:

find . -iname "WSFY321.c" 

Med andre versjoner:

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

Eller et kompromiss som er tregere, men lettere å skrive:

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

Eller i zsh:

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

Kommentarer

  • @Gilles grep -versjonen filtrerer bare store bokstaver, og jeg har ikke ' t forstå ' [^ /] ' .. (ikke /)
  • @Gilles Hva er argumentet til bruk de enkle anførselstegnene i det første tilfellet (nøyaktig filnavn) over ingen anførselstegn i det hele tatt?
  • @ Peter.O Nei * etter / i bash-versjonen. Jeg mente grep -i. Jeg u se [^/]* i stedet for .* for ikke å fange filer i kataloger hvis navn begynner med WSFY.
  • @Bernhard Consistency.
  • Takk Gilles: Jeg slettet den forrige kommentaren med feil syntaks og testet den endrede versjonen, men den ' t arbeid uten * (av en uventet grunn; for meg i det minste). Det store og små bokstaver fungerer ikke lenger: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Jeg antar at ' hvorfor det kalles en nocase‍ glob : det fungerer bare i sammenheng med en glob (eller så ser det ut til).

Svar

To løsninger for macOS:

Bruk av GNU find:

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

Bruker 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 alternativet -iname tilgjengelig som standard.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *