Hledám soubor „WSFY321.c“ ve velké hierarchii adresářů.
Obvykle bych použil Najít GNU : find . -name "WSFY321.c"
Neznám však ten případ, může to být velká, malá nebo kombinace obou.

Jaký je nejjednodušší způsob, jak tento soubor najít?
Existuje něco lepšího než find . | grep -i "WSFY321.c"?

Odpovědět

Poslední verze GNU find mají příznak -iname pro vyhledávání názvů bez rozlišení velkých a malých písmen.

find . -iname "WSFY321.c" 

Komentáře

  • Také proto, že ' konkrétně hledáte soubor, můžete pravděpodobně oholit dalších pár klíšťat s příznakem -type f, takže zvítězil ' neobtěžuje se dívat se na jméno, pokud je inode adresář. Ale to ' s pedantské úrovně optimalizace …
  • Pro práci s některými regexy můžete udělat find . -iname \*WSFY321.c\* -type f

Odpověď

S GNU find nebo jinými verzemi find, které to mají:

find . -iname "WSFY321.c" 

S jinými verzemi:

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

Nebo kompromis, který je pomalejší, ale snadnější na psaní:

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

Nebo v zsh:

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

Komentáře

  • @Gilles Verze grep filtruje pouze velká písmena a ' t porozumět ' [^ /] ' .. (not /)
  • @Gilles Jaký je argument použít jednoduché uvozovky v prvním případě (přesný název souboru) nad žádnými uvozovkami?
  • @ Peter.O Ne * po / v bash verzi. Myslel jsem grep -i. se [^/]* spíše než .*, aby se nezachytily soubory v adresářích, jejichž název začíná WSFY.
  • @Bernhard Consistency.
  • Díky Gilles: Předešlý komentář jsem smazal s nesprávnou syntaxí a otestoval upravenou verzi, ale ' t práce bez * (z neočekávaného důvodu; alespoň pro mě). Možnost rozlišující velká a malá písmena již nefunguje: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c … předpokládám, že proto ' se tomu říká nocase‍ glob : funguje pouze v kontextu glob (nebo se to tak alespoň zdá).

Odpověď

Dvě řešení pro macOS:

Používání GNU find:

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

Používání GNU sed:

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

Komentáře

  • V systému macOS Sierra je ve výchozím nastavení k dispozici možnost -iname.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *