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"?

Odpowiedzi:


214

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

find . -iname "WSFY321.c"

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

@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')"

1
W systemie macOS Sierra opcja -iname jest domyślnie dostępna.
ThomasW
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.