Ik ben op zoek naar het bestand “WSFY321.c” in een enorme directoryhiërarchie.
Gewoonlijk zou ik GNU find : find . -name "WSFY321.c"
Maar ik weet het niet, het kan hoofdletters, kleine letters of een combinatie van beide zijn.

Wat is de gemakkelijkste manier om dit bestand te vinden?
Is er iets beters dan find . | grep -i "WSFY321.c"?

Antwoord

Recente versies van GNU find hebben een -iname vlag, voor het zoeken naar hoofdletter-ongevoelige namen.

find . -iname "WSFY321.c" 

Reacties

  • Ook, aangezien je ' specifiek op zoek bent naar een bestand kunt u waarschijnlijk nog een paar vinkjes schrappen met de -type f vlag zodat het ' Kijk niet naar de naam als de inode een directory is. Maar dat ' s pedante optimalisatieniveaus …
  • Voor het werken met een regex kun je find . -iname \*WSFY321.c\* -type f

Answer

Met GNU find, of andere versies van find die het hebben:

find . -iname "WSFY321.c" 

Met andere versies:

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

Of een compromis dat langzamer maar gemakkelijker te typen is:

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

Of in zsh:

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

Opmerkingen

  • @Gilles De grep -versie filtert alleen hoofdletters, en ik gebruik ' t begrijp de ' [^ /] ' .. (niet /)
  • @Gilles Wat is het argument om gebruik de enkele aanhalingstekens in het eerste geval (exacte bestandsnaam) in plaats van helemaal geen aanhalingstekens?
  • @ Peter.O Nee * na de / in de bash-versie. Ik bedoelde grep -i. Ik u se [^/]* in plaats van .* om geen bestanden op te vangen in mappen waarvan de naam begint met WSFY.
  • @Bernhard Consistentie.
  • Bedankt Gilles: ik heb de vorige opmerking met een onjuiste syntaxis verwijderd en de gewijzigde versie getest, maar dat doet het niet ' t werken zonder de * (om een onverwachte reden; voor mij tenminste). De hoofdletterongevoelige optie werkt niet meer: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … Ik veronderstel dat ' s waarom het een nocase‍ wordt genoemd glob : het werkt alleen in de context van een glob (of zo lijkt het).

Antwoord

Twee oplossingen voor macOS:

GNU gebruiken find:

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

GNU gebruiken sed:

brew install gnu-sed --default-names # restart Terminal find -name "$(sed "s|\([[:alpha:]]\)|[\U\1\L\1]|g" <<<"WSFY321.c")" 

Reacties

  • Op macOS Sierra is de optie -iname standaard beschikbaar.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *