Jag letar efter filen ”WSFY321.c” i en enorm kataloghierarki.
Vanligtvis skulle jag använda GNU-sökning : find . -name "WSFY321.c"
Men jag vet inte fallet, det kan vara versaler, gemener eller en blandning av båda.

Vad är det enklaste sättet att hitta den här filen?
Finns det något bättre än find . | grep -i "WSFY321.c"?

Svar

Senaste versioner av GNU find har en -iname -flagga för skiftlägeskänsliga namnsökningar.

find . -iname "WSFY321.c" 

Kommentarer

  • Eftersom du ' letar specifikt efter en fil som du förmodligen kan raka ytterligare ett par fästingar av med -type f -flaggan så att den vann ' bry dig inte om att titta på namnet om inoden är en katalog. Men att ' s pedantiska nivåer av optimering …
  • För att arbeta med lite regex kan du göra find . -iname \*WSFY321.c\* -type f

Svar

Med GNU find, eller andra versioner av find som har det:

find . -iname "WSFY321.c" 

Med andra versioner:

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

Eller en kompromiss som är långsammare men lättare att skriva:

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

Eller i zsh:

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

Kommentarer

  • @Gilles grep -versionen filtrerar bara versaler och jag ' t förstå ' [^ /] ' .. (inte /)
  • @Gilles Vad är argumentet för använda de enskilda citaten i det första fallet (exakt filnamn) utan några citat alls?
  • @ Peter.O Nej * efter / i bash-versionen. Jag menade grep -i. Jag u se [^/]* snarare än .* för att inte fånga filer i kataloger vars namn börjar med WSFY.
  • @Bernhard Consistency.
  • Tack Gilles: Jag raderade den tidigare kommentaren med fel syntax och testade den ändrade versionen, men den ' t fungerar utan * (av en oväntad anledning; åtminstone för mig). Det skiftlägeskänsliga alternativet fungerar inte längre: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Jag antar att ' varför det kallas ett nocase‍ glob : det fungerar bara i ett globs sammanhang (eller så verkar det).

Svara

Två lösningar för macOS:

Använda GNU find:

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

Med 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 är alternativet -iname tillgängligt som standard.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *