A “WSFY321.c” fájlt keresem hatalmas könyvtárhierarchiában.
Általában a GNU keresés : find . -name "WSFY321.c"
De nem ismerem az esetet, lehet nagybetű, kisbetű vagy mindkettő keveréke.
Mi a legegyszerűbb módja a fájl megkeresésének?
Van valami jobb, mint a find . | grep -i "WSFY321.c"
?
Válasz
A GNU legújabb verziói find
-iname
jelzővel rendelkeznek a kis- és nagybetűk nélküli név keresésekhez.
find . -iname "WSFY321.c"
Megjegyzések
Válasz
GNU kereséssel vagy a megtalálás más verzióival, amelyek rendelkeznek vele:
find . -iname "WSFY321.c"
Más verziókkal:
find . -name "[Ww][Ss][Ff][Yy]321.[Cc]"
Vagy lassabban, de könnyebben beírható kompromisszum:
find . -name "????321.c" | grep -i "/WSFY[^/]*$"
Vagy zsh-ben:
print -rl -- **/(#i)WSFY321.c
Megjegyzések
- @Gilles A
grep
verzió csak a nagybetűket szűri, én pedig nem ' t megérteni a ' [^ /] ' .. (nem /) - @Gilles használja az első idézőjeleket (pontos fájlnév), semmilyen idézőjel helyett?
- @ Peter.O Nem
*
a a bash verzióban.grep -i
-re gondoltam. se[^/]*
helyett.*
, nehogy fájlokat fogjon olyan könyvtárakba, amelyek neveWSFY
. - @Bernhard következetesség.
- Köszönöm Gilles: Az előző megjegyzést hibás szintaxissal töröltem, és teszteltem a módosított verziót, de nem ' t a * nélkül működik (váratlan okból; legalábbis nekem). A kis- és nagybetűk nem érzékeny opció már nem működik:
shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c
… Feltételezem, hogy ' s miért hívják nocase-nek glob : csak globális kontextusban működik (vagy úgy tűnik).
Válasz
Két megoldás a macOS számára:
A GNU használata find
:
brew install findutils --with-default-names # restart Terminal find . -iname "WSFY321.c"
A GNU használata sed
:
brew install gnu-sed --default-names # restart Terminal find -name "$(sed "s|\([[:alpha:]]\)|[\U\1\L\1]|g" <<<"WSFY321.c")"
Megjegyzések
- MacOS Sierra-ban a -iname opció alapértelmezés szerint elérhető.
-type f
zászlóval, így nyert ' ne zavarja a nevet, ha az inode könyvtár. De ez a ' pedáns optimalizálási szint …find . -iname \*WSFY321.c\* -type f