Знайти команду: як ігнорувати випадок?


170

Я шукаю файл "WSFY321.c" у величезній ієрархії каталогів.
Зазвичай я б використовував висновок GNU : find . -name "WSFY321.c"
Але я не знаю випадку, це може бути велика, маленька або комбінація обох.

Який найпростіший спосіб знайти цей файл?
Чи є щось краще, ніж find . | grep -i "WSFY321.c"?

Відповіді:


214

Останні версії GNU findмістять -inameпрапор для нечутливих пошукових імен.

find . -iname "WSFY321.c"

6
Крім того, оскільки ви спеціально шукаєте файл, ви, ймовірно, можете збрити ще пару кліщів, які знаходяться з -type fпрапором, так що це не буде турбувати погляд на ім'я, якщо inode - це каталог. Але це педантичні рівні оптимізації ...
Шадур,

Для роботи з деяким регулярним виразом ви можете зробитиfind . -iname \*WSFY321.c\* -type f
Benj

40

З GNU find або іншими версіями find, які мають його:

find . -iname 'WSFY321.c'

З іншими версіями:

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

Або компроміс, який повільніше, але простіше ввести:

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

Або в zsh:

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

@Gillesgrep версія фільтрації тільки великі букви, і я не розумію '[^ /]' .. (Не /)
Peter.O

@Gilles Який аргумент використовувати одиничні лапки в першому випадку (точне ім'я файлу) над жодними лапками?
Бернхард

@ Peter.O Ні *після /версії bash. Я мав на увазі grep -i. Я використовую, [^/]*а не для того, .*щоб не ловити файли в каталогах, назва яких починається з WSFY.
Жиль

5
@ Бернхард Консистенція.
Жиль

Дякую Жиллю: я видалив попередній коментар з неправильним синтаксисом і протестував доповнену версію, але без * вона не працює (з несподіваної причини; принаймні для мене). Опція не чутливий до регістру більше не працює: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Я вважаю , що саме тому його називають NoCase Glob : він працює тільки в контексті Glob (або так здається).
Пітер.О

1

Два рішення для macOS:

Використання GNU find:

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

Використання GNU sed:

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

1
У macOS Sierra опція -iname доступна за замовчуванням.
ThomasW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.