Znajdź polecenie: jak zignorować wielkość liter?

170

Szukam pliku „WSFY321.c” w ogromnej hierarchii katalogów.
Zwykle używam GNU find : find . -name "WSFY321.c"
ale nie znam przypadku, może to być wielka, mała litera lub połączenie obu.

Jak najłatwiej znaleźć ten plik?
Czy jest coś lepszego niż find . | grep -i "WSFY321.c"?

Nicolas Raoul
źródło

Odpowiedzi:

214

Najnowsze wersje GNU findmają -inameflagę do wyszukiwania nazw bez rozróżniania wielkości liter.

find . -iname "WSFY321.c"
Lars Rohrbach
źródło
6
Ponadto, ponieważ specjalnie szukasz pliku, prawdopodobnie możesz ogolić jeszcze kilka znaczników za pomocą -type fflagi, aby nie zawracało sobie głowy patrzeniem na nazwę, jeśli i-węzeł jest katalogiem. Ale to pedantyczny poziom optymalizacji ...
Shadur
Do pracy z jakimś wyrażeniem regularnym możesz zrobićfind . -iname \*WSFY321.c\* -type f
Benj
40

Z GNU find lub innymi wersjami find, które go mają:

find . -iname 'WSFY321.c'

Z innymi wersjami:

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

Lub kompromis, który jest wolniejszy, ale łatwiejszy do wpisania:

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

Lub w Zsh:

print -rl -- **/(#i)WSFY321.c
Gilles
źródło
@Gillesgrep wersja jest filtrowany tylko górną część obudowy i nie rozumie „[^ /]” .. (nie /)
Peter.O
@Gilles Jaki argument przemawia za użyciem pojedynczych cudzysłowów w pierwszym przypadku (dokładna nazwa pliku) zamiast żadnych cudzysłowów?
Bernhard
@ Peter.O Nie *po /wersji bash. Miałem na myśli grep -i. Używam [^/]*raczej, .*aby nie łapać plików w katalogach, których nazwa zaczyna się od WSFY.
Gilles,
5
@Bernhard Consistency.
Gilles,
Dzięki Gilles: Usunąłem poprzedni komentarz z niepoprawną składnią i przetestowałem poprawioną wersję, ale nie działa bez * (z nieoczekiwanego powodu; przynajmniej dla mnie). Opcja wielkość liter nie działa: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Przypuszczam, że dlatego nazywa się NOCASE glob : to działa tylko w kontekście glob (a przynajmniej tak się wydaje).
Peter.O
1

Dwa rozwiązania dla macOS:

Za pomocą GNU find:

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

Za pomocą GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"
Drew Beres
źródło
1
W systemie macOS Sierra opcja -iname jest domyślnie dostępna.
ThomasW