Найти команду: как игнорировать регистр?

171

Я ищу файл "WSFY321.c" в огромной иерархии каталогов.
Обычно я использую GNU find : find . -name "WSFY321.c"
но я не знаю, в каком регистре это может быть прописная, строчная или сочетание обоих.

Какой самый простой способ найти этот файл?
Есть ли что-то лучше, чем find . | grep -i "WSFY321.c"?

Николас Рауль
источник

Ответы:

216

Последние версии GNU findимеют -inameфлаг для поиска имени без учета регистра.

find . -iname "WSFY321.c"
Ларс Рорбах
источник
6
Кроме того, поскольку вы специально ищете файл, вы, вероятно, можете снять еще пару галочек с этого -type fфлага, чтобы не беспокоиться о его имени, если индекс является каталогом. Но это педантичные уровни оптимизации ...
Шадур
Для работы с некоторыми регулярными выражениями вы можете сделать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[^/]*$'

Или в зш:

print -rl -- **/(#i)WSFY321.c
жилль
источник
@Gillesgrep версия фильтрации только верхний регистр, и я не понимаю '[^ /]' .. (не /)
Peter.O
@ Жиль Каков аргумент, чтобы использовать одинарные кавычки в первом случае (точное имя файла) без кавычек вообще?
Бернхард
@ Peter.O Нет *после /версии bash. Я имел в виду grep -i. Я использую, [^/]*а не .*так, чтобы не перехватывать файлы в каталогах, название которых начинается с WSFY.
Жиль
5
@ Бернхард Последовательность.
Жиль
Спасибо, Жиль: я удалил предыдущий комментарий с неправильным синтаксисом и протестировал исправленную версию, но она не работает без * (по неожиданной причине; по крайней мере для меня). Опция не чувствителен к регистру больше не работает: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Я полагаю , что именно поэтому его называют NoCase Glob : он работает только в контексте Glob (или так кажется).
Peter.O
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